xargs -I substituir-str diferença de opção

14

Pelo que entendi, o seguinte deve significar exatamente o mesmo:

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

se a opção -I não for especificada, o padrão é -I {}.

Eu quero listar todos os arquivos no diretório atual e executar o comando file em cada um deles. Alguns têm espaços em seus nomes. No entanto, notei a diferença. Veja abaixo:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open '{}' (No such file or directory)
Hello: ERROR: cannot open 'Hello' (No such file or directory)
World: ERROR: cannot open 'World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

Com -I {} explicitamente especificado, os espaços em branco nos nomes dos arquivos são tratados conforme o esperado.

    
por foresightyj 07.10.2013 / 03:14

1 resposta

17

O -I requer um marcador de posição definido. A opção -i assumirá {} é o marcador de posição. Foi aqui que encontrei qualquer suposição de {} em man xargs pelo menos em Cygwin e CentOS.

xargs chamados sem nenhuma das opções não precisam do marcador de posição e apenas anexam o STDIN ao final dos argumentos.

Basta adicionar echo aos seus exemplos para ver o que o xargs está fazendo:

$ ls -1
Hello World/

Seu exemplo erroneamente usa {} :

$ ls -1 | xargs echo file {}
file {} Hello World/

, então o file cmd vê argumentos de {} Hello World e erros.

Se você quiser usar explicitamente {} em sua chamada xargs:

$ ls -1 | xargs -i echo file {}
file Hello World/

Ou sem espaço reservado:

$ ls -1 | xargs echo file
file Hello World/

xargs como chamado acima não precisa do {}. Acrescenta o STDIN ao final do comando sem um espaço reservado. O uso de {} geralmente significa que você quer que o STDIN esteja em algum lugar no meio do cmd para executar, como em:

$ ls -1 | xargs -i mv {} /path/to/someplace/.
    
por 08.11.2013 / 22:14

Tags