Xargs '-J' Option

3

Este site apresenta o comando xargs com uma opção -J tornando possível passar a entrada padrão para uma posição desejada no argumento de comando:

find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/

mas em uma página man do GNU xargs esta opção não está presente.

Qual é a maneira de fazer isso, para comandos aceitando isso?

    
por Brethlosze 29.11.2017 / 04:03

2 respostas

1

Se este for o sinal -J para a versão BSD de xargs , não acredito que exista uma opção equivalente exata para o% GNUxargs. -J substitui uma única ocorrência de replstr (por exemplo, % ), com cada linha entrando pela entrada padrão. A versão GNU tem uma opção similar : -I . No entanto, você pode usar replstr várias vezes com esse sinalizador.

Para casos de uso simples, como o seu exemplo, você deve ser capaz de usar o GNU xargs -I como substituto imediato ...

find . -name '*.ext' -print0 | xargs -I % -0 rsync -aP % user@host:dir/

(Ainda mais confuso é que a versão BSD também tem -I e é similar em função a -J e GNU -I ! Mas esse -I é afetado por outros sinalizadores e provavelmente não é o que você é procurando por.)

    
por 29.11.2017 / 05:27
1

Eu não tenho certeza se é isso que você estava esperando, mas no mundo BSD (como o macOS) -I e -J diferem em como eles passam as múltiplas "linhas" para o comando. Exemplo:

$ ls
file1 file2 file3

$ find . -type f -print0 | xargs -I % rm %
rm file1
rm file2
rm file3

$ find . -type f -print0 | xargs -J % rm %
rm file1 file2 file3

Portanto, com -I , xargs executará o comando para cada elemento passado a ele individualmente. Com -J , xargs irá executar o comando uma vez e concatenar todos os elementos e passá-los como argumentos todos juntos.

Alguns comandos, como rm ou mkdir , podem receber vários argumentos e agir sobre eles da mesma maneira 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, o tar . Você pode criar um arquivo tar e adicionar arquivos a ele ou criar um arquivo tar adicionando todos os arquivos de uma vez.

$ find . -iname "*.txt" -or -iname "*.pdf" -print0 | xargs -0 -J % tar cjvf documents.tar.bz2 %
    
por 18.06.2018 / 18:36

Tags