Executar Ações nos Resultados de Busca com find -exec e xargs
Nesta etapa, você irá além da simples listagem de arquivos. Você aprenderá como executar comandos diretamente nos arquivos encontrados pelo comando find. Esta é uma técnica poderosa para realizar operações em lote, como alterar permissões, excluir arquivos ou executar scripts personalizados. Abordaremos dois métodos principais: a opção -exec do find e o comando xargs.
Continuaremos trabalhando no diretório ~/project/find_lab da etapa anterior. Primeiro, certifique-se de estar no diretório correto.
cd ~/project/find_lab
Usando find -exec
A opção -exec permite que você execute um comando arbitrário para cada arquivo que o find localiza. A sintaxe pode parecer um pouco incomum no início:
find [caminho] [expressão] -exec [comando] {} \;
[comando]: O comando que você deseja executar (ex: ls -l, rm, chmod).
{}: Este é um marcador especial. O find substitui {} pelo caminho completo do arquivo atual que ele encontrou.
\;: Este é um terminador obrigatório para o comando -exec. A barra invertida (\) é necessária para evitar que o shell interprete o ponto e vírgula como um caractere especial do próprio shell.
Vamos testar. Encontraremos todos os arquivos com a extensão .txt e executaremos ls -l em cada um para ver suas informações detalhadas.
find . -name "*.txt" -exec ls -l {} \;
A saída mostra o resultado do ls -l sendo executado individualmente para cada arquivo .txt encontrado:
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt
Para maior segurança, o find oferece a opção -ok, que funciona exatamente como o -exec, mas solicita sua confirmação antes de executar o comando em cada arquivo. Isso é altamente recomendado ao realizar operações destrutivas, como excluir arquivos (rm).
Vamos tentar remover os arquivos .log que criamos anteriormente, mas desta vez usando -ok por segurança.
find . -name "*.log" -ok rm {} \;
Para cada arquivo encontrado, o find pedirá sua confirmação. Digite y e pressione Enter para aprovar a exclusão.
< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y
Após confirmar, você pode verificar que os arquivos foram removidos listando o conteúdo do diretório.
ls -R
.:
File1.TXT file1.txt report.txt subdir
./subdir:
file3.txt
Usando xargs
Uma alternativa ao -exec é enviar a saída do find para o comando xargs através de um pipe. O xargs lê itens da entrada padrão (os caminhos de arquivos fornecidos pelo find) e executa um comando especificado usando esses itens como argumentos.
A principal vantagem do xargs é a eficiência. Enquanto o -exec ... \; executa o comando uma vez para cada arquivo individual, o xargs agrupa os caminhos dos arquivos e executa o comando menos vezes, passando vários argumentos de uma só vez.
Primeiro, vamos recriar os arquivos de log que acabamos de excluir para termos algo com que trabalhar.
touch file2.log subdir/another.log
Agora, vamos usar find e xargs para listar os detalhes dos nossos arquivos .log.
find . -name "*.log" | xargs ls -l
A saída é semelhante ao exemplo do -exec, mas a estrutura do comando é diferente:
-rw-r--r-- 1 labex labex 0 <data> <hora> ./file2.log
-rw-r--r-- 1 labex labex 0 <data> <hora> ./subdir/another.log
Assim como o find -ok, o xargs também possui um modo de confirmação usando a opção -p. Ele exibirá o comando que está prestes a ser executado e pedirá sua autorização.
Vamos usar isso para excluir os arquivos .log novamente.
find . -name "*.log" | xargs -p rm
O xargs agrupará os arquivos em um único comando rm e pedirá sua confirmação. Digite y e pressione Enter.
rm ./file2.log ./subdir/another.log ?...y
Você utilizou com sucesso tanto o -exec quanto o xargs para agir sobre resultados de busca, uma habilidade fundamental para automatizar tarefas no Linux.