De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 2 de Março de 2021
Existe um comando, cuja função primordial é construir listas
de parâmetros e passá-la para a execução de outros programas
ou instruções. Este comando é o xargs
e deve ser usado da
seguinte maneira:
xargs [comando [argumento inicial]]
Caso o comando, que pode ser inclusive um script Shell, seja
omitido, será usado por default o echo
.
O xargs
combina o argumento inicial com os argumentos recebidos
da entrada padrão, de forma a executar o comando especificado
uma ou mais vezes.
Exemplo:
Vamos produrar em todos os arquivos abaixo de um determinado
diretório uma cadeia de caracteres usando o comando find
com
a opção type f
para pesquisar somente os arquivos normais,
desprezando diretórios, arquivos especiais, arquivos de
ligações, etc, e vamos torná-la mais genérica recebendo o
nome do diretório inicial e a cadeia a ser pesquisada como
parâmetros. Para isso fazemos:
$ cat grepr
#
# Grep recursivo
# Pesquisa a cadeia de caracteres definida em $2 a partir do diretorio $1
#
find $1 -type f -print|xargs grep -l "$2"
Na execução deste script procuramos, a partir do diretório
definido na variável $1,
todos os arquivos que continham a
cadeia definida na variável $2
.
Exatamente a mesma coisa poderia ser feito se a linha do programa fosse a seguinte:
find $1 -type f -exec grep -l "$2" {} \;
Este processo tem duas grandes desvantagens sobre o anterior:
grep
será feito em cada arquivo que lhe for passado pelo find
,
um-a-um, ao passo que com o xargs
, será passada toda, ou
na pior das hipóteses, a maior parte possível, da lista de
arquivos gerada pelo find
;
find
, poderemos ganhar aquela famosa e fatídica
mensagem de erro Too many arguments indicando um estouro
da pilha de execução do grep
. Como foi dito no item anterior,
se usarmos o xargs
ele passará para o grep
a maior quantidade
de parâmetros possível, suficiente para não causar este erro,
e caso necessário executará o grep
mais de uma vez.
ATENÇÃO! Aê pessoal do linux que usa o ls
colorido que nem
porta de tinturaria: nos exemplos a seguir que envolvem esta
instrução, você devem usar a opção --color=none
, senão existem
grandes chances dos resultados não ocorrerem como o esperado.
Vamos agora analisar um exemplo que é mais ou menos o inverso deste que acabamos de ver. Desta vez, vamos fazer um script para remover todos os arquivos do diretório corrente, pertencentes a um determinado usuário.
A primeira idéia que surge é, como no caso anterior, usar um
comando find
, da seguinte maneira:
$ find . -user cara -exec rm -f {} \;
Quase estaria certo, o problema é que desta forma você removeria não só os arquivos do cara no diretório corrente, mas também de todos os outros subdiretórios "pendurados" neste. Vejamos então como fazer:
$ ls -l | grep " cara " | cut -c55- | xargs rm
Desta forma, o grep
selecionou os arquivos que continham
a cadeia cara
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 ponte.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários