xargs -I {} var = {} echo $ var && echo $ var Isso daria a você: Esse arquivo ou diretório não existe.
Respostas:
27
Basta escrever {}duas vezes em seu comando. O seguinte funcionaria:
$ echo test | xargs -I {} echo {} {}
test test
Seu problema é como os comandos são aninhados . Vamos olhar para isso:
echo test | xargs -I {} echo {} && echo {}
o bash será executado echo test | xargs -I {} echo {}. Se executado com sucesso, echo {}é executado. Para alterar o aninhamento, você pode fazer algo assim:
echo test | xargs -I {} sh -c "echo {} && echo {}"
No entanto, você pode ter problemas porque a abordagem pode estar propensa a injeção de código. Quando "test" é substituído pelo código do shell, ele é executado. Portanto, você provavelmente deve passar a entrada para o shell aninhado com argumentos.
echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Observe que você obterá resultados inesperados em seu último código se tiver um código de acesso, literalmente, $(rm -f *) ,. É melhor fazerxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda
@Kusalananda, obrigado. Eu estava ciente do problema, mas não consegui pensar em uma solução simples naquele momento. Integrei sua sugestão na resposta.
JojOatXGME
5
Outra opção é usar o -isinalizador, que é o mesmo que -I{}(implica que a substituição é fornecida com {}):
Enquanto isso: This option is deprecated; use -I instead.foi adicionado ao manual man xargs.
Jonathan Komar
0
Para mim, apenas as letras minúsculas funcionam. Eu tinha centenas de imagens em um diretório e queria colocá-las em uma lista. A -Iopção i maiúscula não funcionou para mim. Apenas a minúscula. Provavelmente devido a diferenças de versão. Todas essas imagens tinham nomes como Daniel_(somenumber).jpg.
var=test & echo $var ...
Respostas:
Basta escrever
{}
duas vezes em seu comando. O seguinte funcionaria:Seu problema é como os comandos são aninhados . Vamos olhar para isso:
o bash será executado
echo test | xargs -I {} echo {}
. Se executado com sucesso,echo {}
é executado. Para alterar o aninhamento, você pode fazer algo assim:No entanto, você pode ter problemas porque a abordagem pode estar propensa a injeção de código. Quando "test" é substituído pelo código do shell, ele é executado. Portanto, você provavelmente deve passar a entrada para o shell aninhado com argumentos.
fonte
$(rm -f *)
,. É melhor fazerxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Outra opção é usar o
-i
sinalizador, que é o mesmo que-I{}
(implica que a substituição é fornecida com{}
):fonte
This option is deprecated; use -I instead.
foi adicionado ao manualman xargs
.Para mim, apenas as letras minúsculas funcionam. Eu tinha centenas de imagens em um diretório e queria colocá-las em uma lista. A
-I
opção i maiúscula não funcionou para mim. Apenas a minúscula. Provavelmente devido a diferenças de versão. Todas essas imagens tinham nomes comoDaniel_(somenumber).jpg
.Essa sintaxe funcionou:
Devoluções:
Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
fonte