Ao executar o comando find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt
, ele retorna os seguintes resultados.
./testfile.txt
./testread.txt
Em contraste, o comando é find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0
gerado ./testfile.txt./testread.txt
como uma única linha que, ao meu entender, o sinalizador -print0
remove/substitui ou usa \n
- os como separadores.NUL
\0
Quando o último comando e argumentos são passados da xargs
seguinte forma find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 -i echo {}
, ele exibe
./testfile.txt
./testread.txt
Eu assumi que '{}'
subseqüente a echo
não é necessário, pois o sinalizador -print0
é usado e caracteres como espaços são processados sem erros.
Todos os comandos abaixo geram uma única linha.
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 echo
Por que xargs
with {}
retorna os resultados com novos caracteres de linhas?
Se {}
acrescenta um novo caractere de linha, por que usá-lo com um comando, por exemplo echo {}
?
Para GNU
xargs
, a-i
opção é (obsoleta e) a mesma que-I {}
. Isso significa "substituir a ocorrência da string{}
no utilitário por um item da entrada padrão, depois executar o utilitário e repetir com o próximo item da entrada padrão".Sua invocação de utilitário é
echo {}
, e você passa duas coisas paraxargs
. Isso significa chamarecho
duas vezes, cada vez com um dos itens lidos da entrada padrão. Cada invocação deecho
gera uma nova linha à direita (essa é uma característica doecho
).Sem
echo {}
e-i
,xargs
coletará tantos itens quanto possível da entrada padrão e os produzirá como se tivesse chamadoecho
com todos eles de uma só vez.Em suma,
xargs
não adiciona uma nova linha,echo
sim. Ele faz isso porque você o chama várias vezes.Exemplo (com
-t
adicionado de modo quexargs
mostra o que faz):Os caracteres de nova linha estão sendo adicionados por
echo
, não porxargs
.A diferença quando você usa
-i
é porque essa opção força-L 1
(uma linha ou um campo separado por nulo por comando). Assimecho
, execute uma vez para cada campo de entrada e, portanto, um caractere de nova linha entre os campos (echo
normalmente adiciona um caractere de nova linha quando terminar).Sem
-i
, e portanto sem-L 1
, cada eco recebe mais campo, assim a maioria dos campos são separados por um espaço (concatenação de eco seus argumentos, separados por um espaço).