2011-11-20 13 views
6

Ho bisogno di aiuto con uno script bash. Lo script deve rinominare tutti i file in una directory nella sua estensione md5 sum +.Rinomina file in md5 sum + extension (BASH)

Ho trovato lo script di bash in basso, ma deve essere cambiato in modo che aggiunga l'estensione.

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

risposta

12

Questo potrebbe funzionare per voi:

# 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' 

o GNU sed può farlo ancora più breve:

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

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

10

vorrei seguire questa strada:

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

Usa ${F#*.} per ottenere tutto dopo il primo periodo, per esempio tar.gz invece di gz (dipende dalle vostre esigenze)

+0

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

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

O qualcosa di simile farà :-). In realtà, consiglierei di aggiungere un filtro ai nomi dei file per il comando find in quanto non riuscirà nei file senza un . nel loro nome.

HTH