Passar o argumento xargs como uma string para outro comando com '>'?

9

Suponha que eu tenha vários arquivos /tmp/.

eu faço

find . -type f | xargs -iFILES

E eu quero fazer um md5sumem cada arquivo, gerando um arquivo com o mesmo nome, mas com .md5extensão.

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

Isso deve criar um arquivo md5 para cada arquivo encontrado pelo comando find. Em vez disso, ele cria um único arquivo FILES.md5 no disco com somas de verificação de todos os arquivos.

Como digo ao comando md5sum que os FILES representam o nome do arquivo atual e não uma seqüência literal de FILES?

Alguém ainda usa você no MS-DOS
fonte

Respostas:

4

Você precisa de alguma maneira de dizer que deseja enviar a saída de md5sumpara um arquivo. Como find(ou xargs) não possui essa funcionalidade embutida e md5sumapenas sabe imprimir na saída padrão, um redirecionamento de shell é a maneira mais direta.

Observe que seu comando não funcionará no caso geral por outro motivo: o formato de saída findnão é o formato de entrada xargs, eles diferem com os nomes de arquivos que contêm espaço em branco ou \"'. Use em find -execvez disso.

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

Você precisa usar um subshell para lidar com o redirecionamento de E / S:

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

Com o GNU Parallel, você pode:

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

Você obtém o benefício adicional de executar o md5sum em paralelo e arquivos como:

My brother's 12" records.txt

não fará com que seu comando falhe. Assista ao vídeo de introdução para saber mais: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
fonte