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”)
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!