¿Pasar el argumento xargs como una cadena a otro comando con '>'?

9

Supongamos que tengo un montón de archivos adentro /tmp/.

hago

find . -type f | xargs -iFILES

Y quiero hacer un md5sumen cada archivo, dando salida a un archivo con el mismo nombre, pero con .md5extensión.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Se supone que esto crea un archivo md5 para cada archivo encontrado por el comando find. En su lugar, crea un solo archivo FILES.md5 en el disco con sumas de verificación de todos los archivos.

¿Cómo le digo al comando md5sum que los ARCHIVOS representan el nombre de archivo actual y no una cadena literal de ARCHIVOS?

Alguien todavía te usa MS-DOS
fuente

Respuestas:

4

Necesita alguna forma de decir que desea enviar la salida md5suma un archivo. Dado que find(o xargs) no tiene esta funcionalidad incorporada y md5sumsolo sabe cómo imprimir en una salida estándar, la redirección de shell es la forma más sencilla.

Tenga en cuenta que su comando no funcionará en el caso general por otra razón: el formato de salida de findno es el formato de entrada de xargs, difieren con los nombres de archivo que contienen espacios en blanco o \"'. Usar en su find -execlugar.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
Gilles 'SO- deja de ser malvado'
fuente
7

Debe usar una subshell para manejar la redirección de E / S:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
jsbillings
fuente
5

Con GNU Parallel puedes hacer:

find . -type f | parallel md5sum {} \> {}.md5

Obtiene el beneficio adicional de ejecutar md5sum en paralelo y archivos como:

My brother's 12" records.txt

no hará que su comando se bloquee. Mire el video de introducción para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
fuente