Este site apresenta o xargs
comando com uma -J
opção que permite passar a entrada padrão para uma posição desejada no argumento do comando:
find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/
mas em uma página man GNU xargs esta opção não está presente.
Qual é a maneira de fazer isso, para comandos que aceitam isso?
Não tenho certeza se isso é o que você esperava, mas no mundo BSD (como macOS)
-I
e-J
diferem em como eles passam as múltiplas "linhas" para o comando. Exemplo:Assim, com
-I
, o xargs executará o comando para cada elemento passado para ele individualmente. Com-J
, xargs executará o comando uma vez e concatenará todos os elementos e os passará como argumentos todos juntos.Alguns comandos como
rm
oumkdir
podem receber vários argumentos e agir sobre eles da mesma forma como se você passasse um único argumento e os executasse várias vezes. Mas alguns aplicativos podem mudar dependendo de como você passa argumentos para eles. Por exemplo otar
. Você pode criar um arquivo tar e adicionar arquivos a ele ou pode criar um arquivo tar adicionando todos os arquivos de uma só vez.Se este é o
-J
sinalizador para a versão BSD dexargs
, não acredito que haja uma opção equivalente exata para GNUxargs
.-J
substitui uma única ocorrência de replstr (por exemplo%
, ) com cada linha que entra pela entrada padrão. A versão GNU tem uma opção semelhante :-I
1 . No entanto, você pode usar replstr várias vezes com esse sinalizador.Para casos de uso em que não é importante se há uma ou várias invocações de comando, você deve ser capaz de usar o GNU
xargs -I
como um substituto imediato. Mas seu exemplo usarsync
e tenho certeza de que você não deseja várias invocações disso.Seu melhor curso de ação é considerar alternativas começando com
find
e a ação-exec
ou-execdir
. Existem duas variações destes. Um é análogo ao GNU-I
e o outro ao BSD-J
. Veja esses exemplos...Agora compare isso com isso:
A única diferença entre os dois é qual "modificador" aparece no final
+
ou;
.1 Outras coisas confusas é que a versão BSD também tem
-I
e é semelhante em função a ambos-J
e GNU-I
! Mas isso-I
é afetado por outros sinalizadores e provavelmente não é o que você está procurando.