Como usar o parâmetro exec do comando find para realizar operações com os arquivos
No que diz respeito a realizar operações com um conjunto de arquivos que tenham uma característica em comum (por exemplo, acima de 2GB e dentro de determinado conjunto de diretórios), o find (...) -exec faz chover e faz parar, manda prender e manda soltar. E o artigo do link a seguir o apresenta com exemplos – mas cuidado com os exemplos potencialmente destrutivos, com comandos como rm, mv e chmod: no começo, prefira praticar com comandos mais seguros, como ls e echo… (via linuxaria.com – “» Linuxaria – Everything about GNU/Linux and Open source Linux shell, how to use the exec option in find with examples”)
@brlinuxblog




Uma prática aconselhável ao usar comandos que executam operações sensíveis em lote com arquivos, como no exemplo find + rm, é adicionar um echo antes do comando principal. Desta forma se tem uma lista precisa dos comandos que serão executados ao rodar pra valer, e pode -se ver se bate com o desejado.
Não sei, eu não me acostumo a usar o find ou mesmo o xargs pra executar coisas. Sei que, do ponto de vista de desempenho (quem liga pra desempenho quando se usa shell-script?), não é algo bom, mas tenho o custume de usar instruções comuns de linguagens imperativas, tais como for e while.
No caso, dá pra fazer algo como (creio que seja um bashismo):
while read p; do faça_alguma_coisa_com “$p”; done < <(find blablabla)
Isso pq eu sempre me perco com a maneira como o xargs e o find passam parâmetros pros comandos. É uma solução não tão ao estilo "shell-script de ser", mas funciona sempre :-)
Dica importante pro -exec: alguns comandos só mostram o nome do arquivo se tiverem como parâmetros mais de um nome de arquivo. Assim, ao usar o -exec, um “macete” é adicionar /dev/null no final pra ele usar como “segundo arquivo”, e.g.:
OBS.: Vejam que o {} expande mesmo dentro de aspas. E isso ainda protege arquivos com espaços.
OBS. 2: o GNU grep tem o parâmetro -H que sempre imprime o nome do arquivo onde acontece o “match”, mas como o autor desse tutorial disse, algumas vezes você pode estar usando Unixes mais velhos ou corporativos (como AIX e Solaris), sem as ferramentas GNU.
OBS.3: Eu já disse que detesto “smart quotes”? O meu exemplo do comentário anterior não vai funcionar se alguém copiar e colar porque as aspas viraram abre-aspas e fecha-aspas… Bleargh.
Como eu uso pouco o find desta forma (apesar de ser muito útil), não me lembro direito, mas tenho a impressão de ter usado -execdir ao invés de -exec.
é uma mão na roda!