xargs -I opção

12

O manual do xargs diz:

-I replace-str
--replace [= replace-str]
-i [replace-str]
Substitua ocorrências de replace-str nos argumentos iniciais pelos nomes lidos na entrada padrão.

Eu não entendo esta 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 trecho de código acima conta o total de arquivos / diretórios dentro de um diretório.

Alguém poderia explicar isso para mim?

sjsam
fonte

Respostas:

20

"com nomes lidos na entrada padrão" significa que xargsrecebe os dados que entram na entrada padrão, os divide e os usa para executar o comando fornecido em seus argumentos. Por padrão, ele se divide em espaços em branco ou em novas linhas e é executado echocom o maior número possível de argumentos por vez.

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

A -Iopção altera a maneira como as novas linhas de comando são construídas. Em vez de adicionar o maior número possível de argumentos por vez, xargsterá um nome de cada vez da entrada, procure o token fornecido ( {}aqui) e substitua-o pelo nome.

No seu exemplo, {}não está presente no modelo de comando fornecido xargs, portanto, xargsé instruído a executar echosem argumento, uma vez para cada nome de arquivo fornecido por find. Para ver isso, solte o wc:

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.

Stephen Kitt
fonte