Passa l'argomento xargs come stringa a un altro comando con '>'?


9

Supponiamo che io abbia un mucchio di file dentro /tmp/.

lo voglio

find . -type f | xargs -iFILES

E voglio fare un md5sumin ogni file, inviando a un file con lo stesso nome, ma con .md5estensione.

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

Questo dovrebbe creare un file md5 per ogni file trovato dal comando find. Invece, crea un singolo file FILES.md5 su disco con checksum da tutti i file.

Come posso dire al comando md5sum che i FILES rappresentano il nome file corrente e non una stringa letterale FILES?

Risposte:


4

È necessario un modo per dire che si desidera inviare l'output di md5suma un file. Poiché find(o xargs) non ha questa funzionalità integrata e md5sumsa solo stampare su output standard, un reindirizzamento della shell è il modo più semplice.

Nota che il tuo comando non funzionerà nel caso generale per un altro motivo: il formato di output di findnon è il formato di input di xargs, differiscono con i nomi dei file contenenti spazi bianchi o \"'. Usa find -execinvece.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;

7

È necessario utilizzare una subshell per gestire il reindirizzamento IO:

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

5

Con GNU Parallel puoi fare:

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

Ottieni il vantaggio aggiuntivo di eseguire md5sum in parallelo e file come:

My brother's 12" records.txt

non causerà l'arresto anomalo del comando. Guarda il video introduttivo per saperne di più: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.