Header Ads

Como usar o comando xargs no Linux

Precisa colocar alguns comandos do Linux juntos, mas um deles não aceita entrada canalizada? xargs pode pegar a saída de um comando e enviá-lo para outro comando como parâmetros.

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

Esses fluxos funcionam com texto. Enviamos input (stdin) para um comando usando texto, e a resposta (stdout) é escrita na janela do terminal como texto. As mensagens de erro também são gravadas na janela do terminal como texto (stderr).

Um dos ótimos recursos dos sistemas operacionais Linux e Unix é a capacidade de enviar a saída stdout de um comando para a entrada stdin. de um segundo comando. O primeiro comando não se importa com o fato de sua saída não estar indo para uma janela de terminal, e o segundo comando não se importa que sua entrada não esteja vindo de um teclado.

Embora todos os comandos do Linux tem os três fluxos padrão, nem todos aceitam o stdout de outro comando como entrada para seu stdin. Isso significa que você não pode canalizar entradas para eles.

xargs é um comando para construir pipelines de execução usando os fluxos de dados padrão. Usando xargs, podemos fazer com que comandos como echo, rm e mkdir aceitem entrada padrão como argumentos.

O comando xargs

xargs aceitará entrada canalizada. Também pode aceitar entrada de um arquivo. O xargs usa essa entrada como parâmetros para os comandos com os quais falamos para trabalhar. Se não dissermos ao xargs para trabalhar com um comando específico, usaremos echo como padrão.

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

Se usarmos a opção -1 (listar um arquivo por linha) com ls, obteremos uma única coluna de nomes de arquivos.

 ls -1 ./*.sh 

Isto lista os arquivos do shell script no diretório atual.

Obtemos uma única coluna conforme o esperado. Se nós canalizamos através do xargs o que conseguimos?

 ls -1 ./*.sh | xargs 

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

É essa capacidade que vamos xargs alimentar parâmetros em outros comandos.

Usando xargs Com wc

Podemos usar xargs para facilmente contar as palavras, caracteres e linhas em vários arquivos.

 ls * .página | xargs wc 

Isso é o que acontece:

  • ls lista os arquivos * .page e passa a lista para xargs.
  • xargs passa os nomes dos arquivos para wc.
  • O wc trata os nomes dos arquivos como se os tivessem recebido como parâmetros de linha de comando.

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

Usando xargs com confirmação

Podemos usar a opção -p (interativo) para que os xargs nos solicitem confirmação de que ficamos felizes por ela continuar.

Se passarmos uma string de nomes de arquivo para tocar, através de xargs, o touch criará os arquivos para nós.

 echo 'one two três '| xargs -p touch 

O comando que será executado é exibido e o xargs espera que respondamos digitando “y” ou “Y” ou “n” ou “N”, e pressionando Enter.

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

Pressionamos “y” e pressionamos Enter. Podemos usar ls para verificar se os arquivos foram criados.

 ls um dois três 

Usando xargs com vários comandos

]

Podemos usar vários comandos com xargs usando a opção -I (initial arguments).

Esta opção define uma “string substituta”. Onde quer que o token da string substituta apareça no linha de comando, os valores que foram fornecidos para xargs são inseridos.

Vamos usar o comando tree para ver os subdiretórios a partir do diretório atual. A opção -d (diretório) faz com que a árvore ignore arquivos e apenas relate em diretórios.

[PRÉ] árvore -d

Existe um único subdiretório chamado “imagens”.

Em um arquivo chamado "directories.txt", temos os nomes de alguns diretórios que desejamos criar. Podemos olhar para o seu conteúdo usando cat.

 cat directories.txt 

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

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

Isso é assim:

  • cat directories.txt |: Isso envia o conteúdo do arquivo directrories.txt (todos os novos nomes de diretórios) para xargs.
  • xargs -I%: define uma “string de substituição” com o token “%”.
  • sh -c: Isso inicia uma nova sub-camada. O -c (comando) diz ao shell para ler os comandos da linha de comando.
  • ‘echo%; mkdir% ’: cada um dos tokens“% ”será substituído pelos nomes de diretório que são passados ​​por xargs. O comando echo irá imprimir o nome do diretório; o comando mkdir criará o diretório.

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

Podemos usar a árvore mais uma vez para verificar se os diretórios foram criados.

 árvore -d 

Copiando arquivos para vários locais

]

Nós podemos usar o xargs para nos permitir copiar arquivos para múltiplos locais com um único comando.

Vamos direcionar os nomes de dois diretórios para os xargs como parâmetros de entrada. Vamos dizer ao xargs para passar apenas um desses parâmetros de cada vez para o comando com o qual está trabalhando.

Nesse caso, o comando é cp. Portanto, o efeito é chamar cp duas vezes, cada vez com um dos dois diretórios como um parâmetro de linha de comando. O parâmetro xargs que permite que isso aconteça é a opção -n (número máximo). Vamos definir isso como um.

Também estamos usando a opção -v (verbose) com o cp para que ele relate 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 por vez. cp relata cada ação de cópia de arquivo para que possamos vê-los ocorrendo.

Excluindo arquivos em diretórios aninhados

Se nomes de arquivos tiverem espaços e caracteres estranhos em eles - como os caracteres de nova linha - os xargs não poderão interpretá-los corretamente. Podemos superar esse problema usando a opção -0 (terminador nulo). Isso diz ao xargs para usar o caractere nulo como o delimitador final para nomes de arquivos.

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

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

Isso é assim:

  • find. -name “* .png”: find procurará no diretório atual “.” para objetos com nomes que correspondam a “* .png” que são arquivos (tipo -f).
  • -print0: nomes serão terminados por um caractere nulo, e espaços e caracteres estranhos serão atendidos.
  • xargs -0: xargs também considerará nomes de arquivos como terminados por caractere nulo, e espaços e caracteres estranhos não serão causa problemas.
  • rm -v -rf “{}”: rm vai ser detalhado e reportar o que está acontecendo (-v). Ele será recursivo (-r) e examinará os subdiretórios aninhados e removerá os arquivos sem avisar (-f). O "{}" é substituído por cada nome de arquivo.

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

Removendo diretórios aninhados

Digamos que queremos remover um conjunto de subdiretórios aninhados. tree nos permite vê-los.

 árvore -d 

 encontrar. -name "level_one" -tipo d printo | xargs -o rm -v -rf "{}" 

Este comando usará find para pesquisar recursivamente dentro do diretório atual. O alvo da busca é um diretório chamado “level_one”. Os nomes dos diretórios são passados ​​através de xargs para rm.

As únicas alterações significativas entre este comando e o comando anterior são, o termo de pesquisa é o nome do diretório superior e -tipo d diz ao find para procurar diretórios, não arquivos.

O nome de cada diretório é impresso assim que é removido. Podemos verificar com a árvore:

 árvore -d 

Todos os subdiretórios aninhados são excluídos.

Excluindo Todos os arquivos, exceto para um tipo de arquivo

Podemos usar find, xargs e rm para excluir todos os arquivos de um tipo que queremos manter. É um pouco contraditório, mas nós fornecemos o nome do tipo de arquivo que desejamos manter, não o nome dos que queremos excluir.

A opção -not informa ao find para retornar os nomes dos arquivos que não é possível combinar o padrão de pesquisa. Estamos usando a opção -I (argumentos iniciais) com xargs mais uma vez. Desta vez, o token de string de substituição que estamos definindo é "{}". Isso se comportará exatamente da mesma forma que o token replace-string gerado anteriormente, que por acaso é um "%".

 find. -type f -not - nome "* .sh" -print0 | xargs -0 -I {} rm -v {} 

Podemos verificar com ls. Os únicos arquivos restantes no diretório são aqueles que correspondem ao padrão de busca “* .sh”.

 ls -l 

Criando um Arquivo Arquivado com Xargs

Podemos usar o find para procurar por arquivos e passá-los através do xargs para o tar, para criar um arquivo.

Vamos procurar no arquivo atual diretório. O padrão de pesquisa é "* .page", por isso, procuramos por arquivos ".page".

 find ./ - name "* .page" -tipo f -print0 | xargs -0 -tar -cvzf page_files.tar.gz 

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

O mediador de dados

Às vezes você precisa de um pequeno andaime quando você está empilhando as coisas. O xargs preenche a lacuna entre os comandos que podem extrair informações e comandos que não foram criados para isso.

Os xargs e o find possuem um grande número de opções. Você é encorajado a verificar suas páginas de manual para saber mais.

Via: How to Geek

Veja Também:

Nenhum comentário