xargs -I opção

1

O manual do xargs diz:

-I replace-str
--replace[=replace-str]
-i[replace-str]
Replace occurrences of replace-str in the initial arguments with names read from standard input.

Eu não entendo essa parte: with names read from standard input.

Por exemplo, o que está acontecendo com:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

O código acima conta o total de arquivos / diretórios dentro de um diretório.

Alguém poderia explicar isso para mim?

    
por sjsam 11.05.2016 / 03:31

1 resposta

9

"com nomes lidos da entrada padrão" significa que xargs pega os dados que chegam à sua entrada padrão, divide-os e usa-os para executar o comando fornecido em seus argumentos. Por padrão, ele é dividido em espaços em branco ou em novas linhas e executa echo com o maior número de argumentos possível.

A opção -0 no seu exemplo instrui xargs a dividir sua entrada em bytes nulos em vez de espaços em branco ou novas linhas. Combinado com find ' -print0 , isso permite que nomes de arquivos contendo espaços em branco ou novas linhas sejam manipulados adequadamente.

A opção -I altera a maneira como as novas linhas de comando são construídas. Em vez de adicionar tantos argumentos quanto possível por vez, xargs terá um nome de cada vez de sua entrada, procure o token fornecido ( {} here) e substitua-o pelo nome.

No seu exemplo, {} não está presente no modelo de comando dado a xargs , então em vigor xargs é instruído a executar echo sem argumento, uma vez para cada nome de arquivo dado a ele por% código%. Para ver isso, elimine o find :

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

Você verá uma série de linhas em branco ... Compare isso com

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

e

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

e

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

para entender melhor.

    
por 11.05.2016 / 06:32

Tags