Cómo cambiar el nombre de varios files a su contenido 'sum MD5?

Me gustaría cambiar el nombre de algunos files a su contenido 'MD5 sum; por ejemplo, si el file foo está vacío, debe renombrarse a d41d8cd98f00b204e9800998ecf8427e .

¿Tiene que ser un script o puedo usar algo como la herramienta de rename ?

La respuesta de Glenn es buena; aquí hay un refinamiento para múltiples files:

 md5sum file1 file2 file3 | # or *.txt, or whatever while read -r sum filename; do mv -v "$filename" "$sum" done 

Si está generando files con find o similar, puede replace la invocación de md5sum con algo como find . <options> -print0 | xargs -0 md5sum find . <options> -print0 | xargs -0 md5sum find . <options> -print0 | xargs -0 md5sum (con la salida también canalizada en el bucle de shell).

Esto toma la salida de md5sum , que consta de varias líneas con una sum y luego el file al que corresponde, y lo conecta a un bucle de shell que lee cada línea y emite un command mv que cambia el nombre del file del nombre original al sum. Cualquier file con sums idénticas será sobrescrito; sin embargo, salvo circunstancias inusuales (como si estuvieras jugando con colisiones de hash md5), eso significará que tienen el mismo contenido, por lo que no perderás ningún dato de todos modos. Si necesita introducir otras operaciones en cada file, puede ponerlas en el bucle, haciendo reference a las variables $filename y $sum , que contienen el nombre de file original y la sum de MD5, respectivamente.

Con zsh :

 autoload zmv # best in ~/.zshrc zmv '**/*(#qD.)' '$(md5sum<$f)' 

Cambiaría el nombre de todos los files regulares, recursivamente.

(tenga en count que se negará a cambiar el nombre de cualquier file si dos files en el mismo directory tienen la misma sum de comprobación, agregue -f para anularlo).

**/*(#qD.) es el **/*(#qD.) recursivo de zsh con los calificadores glob (en su forma explícita como (#q<qualifiers>) , D para include files ocultos (#q<qualifiers>) para seleccionar únicamente los files normales .

bash:

 md5sum my.file.here | { read sum filename; mv $filename $sum; }