Como usar o comando xargs no Linux

Conteúdo

Um prompt de terminal Linux em um laptop

Você precisa encadear alguns comandos do Linux, mas um deles não aceita entrada canalizada? xargs você pode pegar a saída de um comando e enviá-la para outro comando como parâmetros.

Todos os utilitários padrão do Linux têm três fluxos de dados associado a eles. Eles são o fluxo de entrada padrão (Stdin), fluxo de saída padrão (stdout) e o fluxo de erro padrão (stderr).

Esses fluxos funcionam com texto. Nós enviamos o ticket (Stdin) para um comando usando texto, e a solução (stdout) é escrito na janela do terminal como texto. Além disso, as mensagens de erro são gravadas na janela do terminal como texto (stderr).

Um dos grandes recursos do Linux e dos sistemas operacionais semelhantes ao Unix é a capacidade de canalizar a saída stdout de um comando para a entrada stdin de um segundo comando.. O primeiro comando não se importa se sua saída não vai para uma janela de terminal, e o segundo comando não se importa se sua entrada não vem de um teclado.

Mesmo que todos os comandos do Linux tenham os três fluxos padrão, nem todos aceitam a saída padrão de outro comando como entrada para seu stdin. Isso significa que você não pode canalizar informações para eles.

xargs é um comando para construir pipelines de execução usando fluxos de dados padrão. Através do uso xargs podemos fazer comandos como echo, rm, e mkdir aceitar entrada padrão como argumentos.

O comando xargs

xargs aceitará entrada encanada. Ele também pode aceitar a entrada de um arquivo. xargs use essa entrada como parâmetros para os comandos com os quais dissemos para trabalhar. Se não contarmos xargs trabalhar com um comando específico, será usado por padrão echo.

Podemos usar isso para demonstrar como xargs sempre exibirá uma única linha de saída, mesmo a partir de uma entrada de várias linhas.

Se usarmos o -1 (liste um arquivo por linha) com opção ls, nós temos um coluna única de nomes de arquivo.

ls -1 ./*.sh

Isso lista os arquivos de script de shell no diretório atual.

Recebemos uma única coluna conforme o esperado. Se o canalizarmos xargs o que nós ganhamos

ls -1 ./*.sh | xargs

A saída é gravada na janela do terminal, como um longo fluxo de texto.

É esta habilidade que xargs insira parâmetros em outros comandos.

Usando xargs com banheiro

Podemos usar xargs facilmente ter wc conte o palavras, personagens e falas em vários arquivos.

ls * .page | xargs wc

Isto é o que acontece:

  • ls listar arquivos * .página e passe a lista para xargs.
  • xargs passe os nomes dos arquivos para wc.
  • wc trata nomes de arquivo como se você os tivesse recebido como parâmetros de linha de comando.

As estatísticas de cada arquivo são exibidas junto com um total geral.

Use xargs com confirmação

Podemos usar o -p opção (interativo) para ter xargs Peça-nos uma confirmação de que teremos todo o gosto em prosseguir.

Se passarmos uma sequência de nomes de arquivos para touch, através de xargs, touch Vai crie os arquivos para nós.

eco 'um dois três' | xargs -p touch

O comando a ser executado é exibido e xargs espere que respondamos escrevendo "y" ou "y", o “n” o “N”, e pressionando Enter.

Se você apenas pressionar Enter, é tratado como “n”. O comando só é executado se você digitar "y" ou "Y".

Pressione "y" e pressione Enter. Podemos usar ls para verificar se os arquivos foram criados.

é um dois três

Use o xargs com alguns comandos

Podemos usar vários comandos com xargs usando o -I (argumentos iniciais) opção.

é tratado como “é tratado como”. Onde quer que o token para a string de substituição apareça na linha de comando, os valores que foram fornecidos para xargs são inseridos.

Vamos usar o tree comando para ver os subdiretórios do diretório atual. a -d (diretório) opção causa tree para ignorar arquivos e apenas relatar sobre diretórios.

árvore -d

é tratado como “imagens”.

Em um arquivo chamado "diretórios.txt", temos os nomes de alguns diretórios que afirmamos ter criado. Podemos analisar seu conteúdo usando cat.

cat directory.txt

Usaremos isso como dados de entrada para xargs. O comando que vamos fazer é este:

cat directory.txt | xargs -I % sh -c 'echo %; mkdir% '

Isso quebra assim:

  • cat directorios.txt |: Isso insere o conteúdo do arquivo directrories.txt (todos os novos nomes de diretório) sobre xargs.
  • xargs -I%: é tratado como “é tratado como” é tratado como “%”.
  • sh -c: Isso inicia uma nova subcamada. a -c (comando) diz ao shell para ler os comandos da linha de comando.
  • ‘Eco %; mkdir% ‘: é tratado como “%” é tratado como xargs. a echo o comando irá imprimir o nome do diretório; a mkdir comando irá criar diretório.

Os diretórios são listados um por um.

Podemos usar tree mais uma vez para verificar se os diretórios foram criados.

árvore -d

Copie arquivos para vários locais

Podemos usar xargs para nos permitir copiar arquivos para vários locais com um único comando.

Vamos canalizar os nomes de dois diretórios para xargs como parâmetros de entrada. Bem dito xargs para passar apenas um desses parâmetros por vez para o comando com o qual você está trabalhando.

Nesta circunstância, o comando é cp. Então, o efeito é chamar cp duas vezes, cada vez com um dos dois diretórios como parâmetro de linha de comando. a xargs parâmetro que permite que isso aconteça é o -n (numero maximo) opção. Vamos definir isso como um.

Também estamos usando o -v (detalhado) opção com cp para relatar o que está acontecendo.

echo ~ / Backups / ~ / Documents / page-files / | xargs -n 1 cp -v ./*.page

Os arquivos são copiados para os dois diretórios, um diretório ao mesmo tempo. cp relata cada ação de cópia de arquivo para que possamos ver como são realizadas.

Remover arquivos em diretórios aninhados

Se os nomes dos arquivos tiverem espaços e caracteres estranhos, como caracteres de nova linha, xargs você não será capaz de interpretá-los corretamente. Podemos superar esse problema usando a opção -0 (terminador nulo). Isso diz xargs para usar o caractere nulo como um delimitador final para nomes de arquivo.

Vamos usar find neste exemplo. find tem sua própria opção para lidar com espaços em branco e caracteres estranhos em nomes de arquivos. É o -print0 (nome completo, personagem nulo).

achar . -nome "*.png" -tipo f -print0 | xargs -0 rm -v -rf "{}"

Isso quebra assim:

  • circunstâncias . -Nome “* .png”: find é tratado como “.” é tratado como “* .png” é tratado como (type -f).
  • -print0: nomes terminarão com um caractere nulo e espaços e caracteres estranhos serão atendidos.
  • xargs -0: xargs além disso, considerará que os nomes dos arquivos terminam em nulos, e espaços e caracteres estranhos não causarão problemas.
  • rm -v -rf “{}”: rm será prolixo e relatará o que está acontecendo (-v). Será recursivo (-r) e pesquisará em subdiretórios aninhados, e deletaremos arquivos sem perguntar (-f). o “{}” é tratado como.

Todos os subdiretórios são pesquisados ​​e os arquivos que correspondem ao padrão de pesquisa são removidos.

Remover diretórios aninhados

Digamos que queremos excluir um conjunto de subdiretórios aninhados. tree vai nos deixar vê-los.

árvore -d

achar . -nome "nível um" -tipo d printo | xargs -o rm -v -rf "{}"

Este comando usará find para pesquisar recursivamente no diretório atual. é tratado como “nível um”. Nomes de diretórios são passados xargs para rm.

As únicas mudanças significativas entre este comando e o comando anterior são, o termo de pesquisa é o nome do diretório principal e -type d dados find para pesquisar diretórios, sem arquivos.

O nome de cada diretório é impresso à medida que é excluído. Podemos consultar com tree :

árvore -d

Todos os subdiretórios aninhados são removidos.

Apagar todos os arquivos, exceto um tipo de arquivo

Podemos usar find, xargs e rm para excluir todos os arquivos, exceto um tipo que queremos manter. É um pouco contraditório, mas fornecemos o nome do tipo de arquivo que pretendemos Salve , não o nome daqueles que queremos deletar.

a -not opção diz find para retornar os nomes dos arquivos que não coincidir com o padrão de pesquisa. Estamos usando o -I (argumentos iniciais) opção com xargs mais uma vez. Desta vez, é tratado como “{}”. Isso se comportará exatamente da mesma forma que o token de string de substituição que geramos anteriormente, é tratado como “%”.

achar . -tipo f -não - nome "*.sh" -print0 | xargs -0 -eu {} rm -v {}

Podemos consultar com ls. é tratado como “* .sh”.

ls -l

Crie um arquivo com o Xargs

Podemos usar find para procurar arquivos e passá-los xargs para tar, para criar um arquivo.

Vamos pesquisar o diretório atual. é tratado como “* .página”, é tratado como “.página”.

achar ./ - nome "*.página" -tipo f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

Os arquivos são listados conforme o esperado, conforme o arquivo é criado.

O mediador de dados

Às vezes você precisa de um pequeno andaime ao empilhar as coisas. xargs preenche a lacuna entre comandos que podem enviar informações e comandos que não são projetados para recebê-las.

Ambos xargs e find tem um grande número de alternativas. Sugerimos que você consulte suas páginas de manual para obter mais informações..

setTimeout(função(){
!função(f,b,e,v,n,t,s)
{E se(f.fbq)Retorna;n = f.fbq = função(){n.callMethod?
n.callMethod.apply(n,argumentos):n.queue.push(argumentos)};
E se(!f._fbq)f._fbq = n;n.push = n;n.loaded =!0;n.version = ’2.0′;
n.queue =[];t = b.createElement(e);t.async =!0;
t.src = v;s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, documento,'roteiro',
‘Https://connect.facebook.net/en_US/fbevents.js ’);
fbq('iniciar', ‘335401813750447’);
fbq('acompanhar', ‘PageView’);
},3000);

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.