2011-11-20 25 views
6

Potrzebuję pomocy w skrypcie basha. Skrypt musi zmienić nazwę wszystkich plików w katalogu na jego sumę md5 +.Zmiana nazwy plików na sumę md5 + rozszerzenie (BASH)

Znalazłem poniższy skrypt bash, ale musi on zostać zmieniony, aby dodać rozszerzenie.

md5sum * | sed 's/^\(\w*\)\s*\(.*\)/\2 \1/' | while read LINE; do mv $LINE; done 

Odpowiedz

12

To może pracować dla Ciebie:

# mkdir temp && cd temp && touch file.{a..e} 
# ls 
file.a file.b file.c file.d file.e 
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/' | sh 
`file.a' -> `d41d8cd98f00b204e9800998ecf8427e.a' 
`file.b' -> `d41d8cd98f00b204e9800998ecf8427e.b' 
`file.c' -> `d41d8cd98f00b204e9800998ecf8427e.c' 
`file.d' -> `d41d8cd98f00b204e9800998ecf8427e.d' 
`file.e' -> `d41d8cd98f00b204e9800998ecf8427e.e' 

Albo GNU sed może zrobić to jeszcze krócej:

# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e' 
+2

Wersja Apple/OSX to: 'md5 * | sed-e/MD5 (\ ([^.] * \) \ (. [^)] * \)) = \ (. * \) $/mv -v "\ 1 \ 2" \ 3 \ 2/"| sh' – fnl

10

pójdę tą drogą:

for F in $DIR/*.*; do 
    mv "$F" "$(md5sum "$F" | cut -d' ' -f1).${F##*.}"; 
done 

Korzystając ${F#*.} aby wszystko po pierwszym okresie, na przykład tar.gz zamiast gz (w zależności od potrzeb)

+0

OSX: 'dla F w $ DIR /*.*; do mv "$ F" "$ (md5" $ F "| cut -d" "-f4). $ {F ## *.}"; done' –

0
find . -type f -exec mv \{\} "`md5sum \{\} | sed 's/ .*//'`.`echo \{\} | awk -v FS='.' '{print $NF}'\" 

Albo coś takiego zrobi :-). Właściwie, polecam dodać filtr do nazw plików dla polecenia find, ponieważ spowoduje to niepowodzenie w plikach bez nazwy ..

HTH

Powiązane problemy