Am I correct that xargs runs command in several run, each of which with different sequence of arguments?
Sim (a menos que a entrada para xargs
seja repetida, é claro)
mycommand arg1 arg2 arg3
must be effectively the same as
mycommand arg1 mycommand arg2 arg3
Praticamente, já que, em geral, não podemos saber onde xargs
irá dividir a lista. GNU xargs tem --show-limits
que pode ser usado para determinar se todas as entradas se encaixam em uma execução do comando.
É claro que se os argumentos devem ser passados para o comando em conjuntos de N , podemos usar -n N
para ter algum controle sobre ele (ou -n M
com M alguns múltiplos de N ).
Is there any command which doesn't satisfy the above condition? (I can't find any.) If there is, can it be run by xargs?
Kusalananda mencionou mv
, que tem a questão de que o último argumento é tratado de forma diferente dos outros. Com efeito, os argumentos adicionados por xargs
precisariam ir para o meio e não há uma maneira padrão de fazer isso. (O FreeBSD xargs tem -J {}
que faz isso e o GNU mv
tem a opção -t dir
para passar o diretório de destino no início da lista de argumentos. cp
é similar.)
Então, algo como tar -czf foo.tar.gz
não funcionaria, pois -c
(create) sobrescreve o arquivo em cada execução. Isso poderia ser evitado usando -r
(append) em vez de -c
, mas pelo menos o tar do GNU não suporta anexar a um archive compactado.
Felizmente, a maioria dos utilitários trabalha arquivo por arquivo e foi projetada para aceitar uma lista de arquivos no final.
Can the arguments passed by xargs to command be any kind of arguments: options, option arguments, or nonoption arguments?
Eles são apenas strings, xargs
não sabe o que eles significam. Se você tivesse um utilitário que não aceitasse a lista usual de arquivos, mas aceitasse uma opção -f filename
, você poderia organizar o xargs
para obter entradas como -f file1 -f file2 ...
e seria muito bom passar adiante. Embora com muita entrada, o limite de tamanho poderia causar novamente uma divisão entre um -f
e um nome de arquivo, mas adicionar algo como -n 100
tornaria isso improvável (dependendo do tamanho dos arquivos e do limite de tamanho real). / p>
What if -i of xargs is involved?
-i
no GNU xargs é o mesmo que -I {}
, e de forma um tanto enfadonha torna xargs
executar o comando uma vez para cada argumento de entrada. Ajuda se você precisar colocar o argumento no meio do comando, mas realmente não ajuda a reduzir o número de invocações para o comando.