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

9

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

eu faço

find . -type f | xargs -iFILES

E eu quero fazer um md5sum em cada arquivo, saindo para um arquivo com o mesmo nome, mas com .md5 extensão.

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

Isto 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 dizer ao comando md5sum que os ARQUIVOS representam o nome do arquivo atual e não uma string literal FILES?

    
por Somebody still uses you MS-DOS 04.02.2011 / 16:56

3 respostas

4

Você precisa de alguma maneira de dizer que deseja enviar a saída de md5sum para um arquivo. Como find (ou xargs ) não tem essa funcionalidade incorporada e md5sum sabe apenas como imprimir para a 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 de find não é o formato de entrada de xargs , eles diferem com nomes de arquivos contendo espaço em branco ou \"' . Use find -exec em vez disso.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
    
por 05.02.2011 / 00:25
7

Você precisa usar um subshell para lidar com o redirecionamento de IO:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
    
por 04.02.2011 / 17:14
5

Com o GNU Parallel você pode fazer:

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 trave. Assista ao vídeo de introdução para saber mais: link

    
por 07.02.2011 / 16:31