null

“Existem comandos Linux e existe o xargs”

Gosto muito da praticidade do terminal. Para alguns, um pavor; para outros uma obrigação. No meio disso, existem comandos que aumentam bastante nossa produtividade e que você não deveria refutar isso.

Entre diversos deles, destaco o comando xargs, um comando capaz de aumentar sua produtividade.

Contextualizando

Todos os utilitários padrões do Linux possuem 3 fluxos de dados associados a eles:

  • 1. fluxo de entrada padrão (stdin),
  • 2. fluxo de saída padrão (stdout),
  • 3. fluxo de erro padrão (stderr)

Esses fluxos estão todos em modo texto. Enviamos input (stdin) para um comando usando texto, e a resposta (stdout) é escrita na janela do terminal como texto. Mensagens de erro também são exibidas no terminal como texto (stderr).

Um dos grandes recursos dos sistemas Linux e Unix é a habilidade de canalizar a saída padrão stdout de um comando para a entrada stdin de um segundo comando \o/ Assim, o primeiro comando não difere se sua saída não estar indo para um texto num terminal; e o** segundo comando** não distingue que sua entrada não esteja vindo de um teclado.

Embora todos os comandos do Linux tenham os três fluxos padrão, nem todos aceitam o stdout de outro comando como entrada para sua entrada padrão. Isso significa que você não pode canalizar a entrada para eles. Daí o comando xargs entra na jogada :)

O comando xargs

O comando xargs é um comando para construir pipelines de execução usando os fluxos de dados padrão. O xargs aceitará entrada canalizada.

Ele tem função primeira receber uma entrada de uma lista de parâmetros de outro comando e passá-la para a execução de outro comando – isso tudo numa única sentença, através do uso do pipeline (|). Parece complexo, né?

Em resumo, o xargs pode pegar a saída de um comando e enviá-lo para outro como parâmetros ! :)

 $_ comando | xargs [opções] [comando] [lista_parâmetros comando anterior]

Exemplos

Como caso prático, mostro a leitura de arquivo de texto:

$ cat /home/s0n0/lista.txt
arquivo_1  
arquivo_2  
arquivo_3  
arquivo_4

E se canalizarmos a saída do comando anterior através do comando xargs e pipeline (|)? Uma lista é exibida na janela do terminal:

$ cat /home/s0n0/lista.txt | xargs
arquivo_1 arquivo_2 arquivo_3 arquivo_4

Assim, esse recurso permite que o xargs receba essa lista como parâmetros para outro(s) comando(s). Por exemplo: touch.

$ cat /home/s0n0/lista.txt | xargs touch

Esse último comando se divide assim:

  • – **cat directories.txt **| : Isso envia o conteúdo do arquivo lista.txt (todos os nomes de arquivos) para o xargs.
  • xargs touch: cria (touch) todos os arquivos baseado na lista de parâmetros recebida do comando cat.

Por fim, dado a criação dos arquivos listados no arquivo, podemos usar a mesma estrutura para removê-los, simultaneamente, usando o comando rm:

$ cat /home/s0n0/lista.txt | xargs rm

Considerações

Diante do exposto, você percebe que essa canalização da entrada de dados de outro comando para o xargs pode aumentar sua produtividade, pois você evita repetições ou uso de scripts “complexos” para capturar saídas de outros comandos para, posteriormente, manipulá-los em outras estruturas de dados – numa única sentença você faz trabalhos simultâneos mais rapidamente.

É claro que o uso de recursos de shell script podem aumentar o nível de granularidade da lista de parâmetros canalizadas pelo xargs. Por exemplo:

$ ls -l | grep ” algo ” | cut -c55- | xargs rm

Onde, o grep selecionou os arquivos que continham a cadeia “algo” no diretório corrente listado pelo ls -l. O comando cut pegou somente o nome dos arquivos, passando-os para a remoção pelo rm usando o comando xargs como sequencia.

Então, o poder e a versatilidade do xargs se torna cada vez mais marcante!



Via: Dicas-L | HowToGeek