Qual é o uso de -exec xargs e -print0?

20

Eu acho que essas são as maneiras comuns de passar o resultado de um comando para o próximo, como entradas.

Como esses três funcionam? Ou quais são alguns sites / URLs?

James Bond
fonte

Respostas:

25

Primeiras coisas a digitar:

man find

man xargs

O findcomando imprime os resultados na saída padrão por padrão, portanto, a -printopção normalmente não é necessária, mas -print0separa os nomes de arquivos com um byte 0 (NULL) para que nomes contendo espaços ou novas linhas possam ser interpretados corretamente.

A -execopção é algo que você pode usar em vez de xargs - o comando find executa um comando para cada item encontrado.

O xargscomando lê cadeias separadas por espaço ou nova linha (normalmente do comando find , mas elas podem vir de qualquer lugar) e executa algum comando para cada cadeia.
Se o xargs for executado com uma opção -0 , ele esperará seqüências separadas por NULL como saída porfind ... -print0

A vantagem do xargs é que ele pode agrupar as seqüências de caracteres, para que ele execute apenas um comando uma ou duas vezes em vez de n vezes.

Portanto, no uso normal:

find start_directory -name '*.txt' | xargs ls -l 

find listaria os nomes de arquivos e o xargs emitia comandos como:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

o que é mais rápido do que emitir o seu comando find:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
njd
fonte
7

Observe que o xargs não é mais necessário nas implementações atuais de localização que provavelmente suportam essa sintaxe POSIX:

find directory -name '*.txt' -exec ls -l {} + 

que é mais simples e um pouco mais rápido que a variante xargs.

find directory -name '*.txt' | xargs ls -l 
jlliagre
fonte
O xargs usa muito menos recursos do que o 'find -exec'
Felipe Alvarez
7
É o contrário. A tubulação para xargs usará um pouco mais de recursos que -exec. Você provavelmente ignora o terminador "+".
Jlliagre