2011-11-20 16 views
6

Necesito ayuda con un script bash. El script necesita cambiar el nombre de todos los archivos en un directorio a su md5 sum + extension.Renombrar archivos a md5 sum + extension (BASH)

He encontrado el script bash a continuación, pero debe cambiarse para que agregue la extensión.

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

Respuesta

12

Esto podría funcionar para usted:

# 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 puede hacerlo aún más corto:

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

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

10

Me gustaría ir a esta ruta:

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

Uso ${F#*.} para conseguir todo después del primer período, por ejemplo, tar.gz en lugar de gz (depende de sus necesidades)

+0

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

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

O algo como esto va a hacer :-). En realidad, recomendaría agregar un filtro a los nombres de archivo para el comando find ya que fallará en los archivos sin un . en su nombre.

HTH