Átnevezéses feladat

Az alábbi könyvtárakban lévő fájlokat kell átnevezni, úgy hogy 1-től sorszám.jpg legyen a nevük és egy könyvtárba kerüljenek. Ki hogyan oldaná meg? Shell script illetve awk.

TMP$ ls -R
.:
1  2  3  4  5  6  7

./1:
A001.jpg  A005.jpg   Am002.jpg  Am006.jpg  B004.jpg  Bm001.jpg  Bm005.jpg
A002.jpg  A006.jpg   Am003.jpg  B001.jpg   B005.jpg  Bm002.jpg  Bm006.jpg
A003.jpg  A007.jpg   Am004.jpg  B002.jpg   B006.jpg  Bm003.jpg
A004.jpg  Am001.jpg  Am005.jpg  B003.jpg   B007.jpg  Bm004.jpg

./2:
A001.jpg  A005.jpg   Am002.jpg  B001.jpg  B005.jpg   Bm002.jpg
A002.jpg  A006.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm003.jpg
A003.jpg  A007.jpg   Am004.jpg  B003.jpg  B007.jpg   Bm004.jpg
A004.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm001.jpg  Bm005.jpg

./3:
A001.jpg  A005.jpg   Am002.jpg  B001.jpg  B005.jpg   Bm002.jpg
A002.jpg  A006.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm003.jpg
A003.jpg  A007.jpg   Am004.jpg  B003.jpg  B007.jpg   Bm004.jpg
A004.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm001.jpg  Bm005.jpg

./4:
A001.jpg  A005.jpg   Am002.jpg  B001.jpg  B005.jpg   Bm002.jpg
A002.jpg  A006.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm003.jpg
A003.jpg  A007.jpg   Am004.jpg  B003.jpg  B007.jpg   Bm004.jpg
A004.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm001.jpg  Bm005.jpg

./5:
A001.jpg  A005.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm004.jpg
A002.jpg  A006.jpg   Am004.jpg  B003.jpg  Bm001.jpg  Bm005.jpg
A003.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm002.jpg
A004.jpg  Am002.jpg  B001.jpg   B005.jpg  Bm003.jpg

./6:
A001.jpg  A005.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm004.jpg
A002.jpg  A006.jpg   Am004.jpg  B003.jpg  Bm001.jpg  Bm005.jpg
A003.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm002.jpg
A004.jpg  Am002.jpg  B001.jpg   B005.jpg  Bm003.jpg

./7:
A001.jpg  A005.jpg   Am002.jpg  B001.jpg  B005.jpg   Bm002.jpg  Bm006.jpg
A002.jpg  A006.jpg   Am003.jpg  B002.jpg  B006.jpg   Bm003.jpg
A003.jpg  A007.jpg   Am004.jpg  B003.jpg  B007.jpg   Bm004.jpg
A004.jpg  Am001.jpg  Am005.jpg  B004.jpg  Bm001.jpg  Bm005.jpg

Hozzászólások

én könyvtáranként for ciklussal csináltam. közben egy olyan dologra nem jöttem rá, hogy find -exec -nek hogyan adjam meg a következőt: pl 1..9 .jpg-t 01..09 .jpg-re átnevezni. find minduntalan ./1.jpg-t talál -exec mv {} 0{} pedig 0./1.jpg.

konkrétan így, eredmény alant:

TMP$ a=1 ; for i in `ls -1` ; do cd $i ; for j in `ls -1` ; do mv $j $a ; let a=$a+1 ; done ; cd .. ; done

jó kihagytam a .jpg-t, de ez most irreleváns (illetve akkor már lehetne

mv $j ../$a.jpg

), hanem az érdekelne, hogyan lehetne 3 karakteres minden file név, hogy mondjuk ls -1 sorba tegye és ne ilyen output legyen:

TMP$ ls -1
1
10
100
11
12
13
14
15
16
17
18
19
2
TMP$ ls -R
.:
1  2  3  4  5  6  7

./1:
1  10  11  12  13  14  15  16  17  18  19  2  20  21  22  23  24  25  26  3  4  5  6  7  8  9

./2:
27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50

./3:
51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74

./4:
75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98

./5:
100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  99

./6:
121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142

./7:
143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  163  164  165  166  167

látom vmelyik egyetemen/fősulin ezt adták házinak :)
(2 nap alatt a 3. ugyanilyen kérdést látom a 3. fórumon) :)

Pl.:

find . -type f -name *.jpg | (i=1; while read file ; do mv "$file" "$target_dir/$(printf %04d $i).jpg"; let i++; done)

Arra azért figyelj, hogy a find ne másszon bele a target_dir-be.

már hogy random? elvileg i-node szám alapján van sorban, de egész érdekesen csinálja:

TMP$ find . -type f -name *.jpg -ls | awk -F" " '{ print $1 " " $11}'
145328 ./1/Bm001.jpg
145329 ./1/Bm002.jpg
145330 ./1/Bm003.jpg
145331 ./1/Bm004.jpg
145332 ./1/Bm005.jpg
145333 ./1/Bm006.jpg
145321 ./1/B001.jpg
145322 ./1/B002.jpg
145323 ./1/B003.jpg
145324 ./1/B004.jpg
145325 ./1/B005.jpg
145326 ./1/B006.jpg
145327 ./1/B007.jpg
145315 ./1/Am001.jpg
145316 ./1/Am002.jpg
145317 ./1/Am003.jpg
145318 ./1/Am004.jpg
145319 ./1/Am005.jpg
145320 ./1/Am006.jpg
38031 ./1/A001.jpg
97378 ./1/A002.jpg
145308 ./1/A003.jpg
145311 ./1/A004.jpg
145312 ./1/A005.jpg
145313 ./1/A006.jpg
145314 ./1/A007.jpg

Természetesen a "random" helytelen szóhasználat volt részemről, csak azt kívántam hangsúlyozni, hogy nem ábécében.

Valóban a könyvtárbeli előfordulási sorrendben járja be, lásd az ls -u vagy -U kapcsolója (mindig elfelejtem hogy melyik), már amennyire az "előfordulási sorrend" értelmezhető.

Régi fájlrendszerek lineárisan tárolták a bejegyzéseket, létrehozási sorrendben, de ha töröltél egy fájlt, akkor ott keletkezett egy akkora lyuk, ahova a következőnek létrehozott a fájlnév hosszának függvényében vagy belefért, vagy nem.

Újabb fájlrendszerek már fastruktúrát vagy valami hasonlót használnak, továbbá a fájlrendszer létrehozásakor sorsolt titkos véletlenszámmal megkavarják a hash algoritmust, hogy ne legyen DoS-olható a rendszer. Tehát ha kétszer egymás után ugyanazzal az mkfs paranccsal csinálsz ugyanakkora fájlrendszert és ugyanazzal a parancssorozattal hozod létre a fájlokat, akkor is eltérő lesz a két sorrend.