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
grepserá 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 oxargsele passará para ogrepa maior quantidade de parâmetros possível, suficiente para não causar este erro, e caso necessário executará ogrepmais 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.