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 feita 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:
- A primeira é bastante visível: o tempo de execução
deste método é muito superior ao daquele, isso porque o
grep
será feito em cada arquivo que lhe for passado pelofind
, um-a-um, ao passo que com oxargs
, será passada toda, ou na pior das hipóteses, a maior parte possível, da lista de arquivos gerada pelofind
; - Dependendo da quantidade de arquivos encontrados que atendem ao
find
, poderemos ganhar aquela famosa e fatídica mensagem de erro "//Too many arguments//" indicando um estouro da pilha de execução dogrep
. Como foi dito no item anterior, se usarmos oxargs
ele passará para ogrep
a maior quantidade de parâmetros possível, suficiente para não causar este erro, e caso necessário executará ogrep
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
, se nã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.