No Linux, o comando find é capaz de realizar diversas ações nos arquivos ou diretórios por ele encontrado. Uma das ações mais utilizadas é a "-exec", que executa um comando se o estado 0 (zero) for retornado, ou seja, quando um arquivo ou diretório for encontrado. Para quem não sabe, o comando find procura por arquivos em uma estrutura hierárquica de diretórios e pode retornar o caminho completo para o arquivo encontrado.
Esta opção do comando find é mais indicada quando forem executados comandos simples, pois uma limitação da opção "-exec" é que o comando é executado em um arquivo de cada vez.
Mas a opção "-exec" pode ser bastante perigosa pois um comando mal compreendido pode colocar em risco arquivos que não devem ser manipulados. Isto é especialmente importante se a opção "-exec" contém o comando rm ou outro comando destrutivo. Sendo assim, sempre teste o comando find usando a opção "-ls" ao invés da "-exec", para ver se os arquivos selecionados são mesmo o que deseja processar.
Para o find executar o comando em cada arquivo encontrado são necessárias duas artimanhas na sintaxe. Uma é que o comando que deseja executar precisa conter o argumento especial {}, que será substituído pelo nome do arquivo encontrado em cada invocação da ação "-exec". Outra é que é necessário existir um \; (ou ';') no final do comando (a barra invertida ou as aspas simples são necessárias pois senão o Shell interpretará o ponto-e-vírgula como fim do comando find). Se o parâmetro {} for o último item no comando então é necessário ter um espaço entre o {} e o \;. Pode ser necessário também proteger o argumento {}, consequentemente o nome do arquivo, com aspas simples, ficando '{}'. Veja alguns exemplos:
Procurar todos os arquivos a partir do diretório atual e descrever o tipo:
find . -type f -exec file '{}' \;
Procurar todos os arquivos a partir do diretório atual e alterar a permissão para 644:
find ./ -type f -exec chmod 644 {} \;
Procurar todos os arquivos a partir do diretório especificado e gerar o hash SHA1:
find diretório/ -type f -exec sha1sum '{} ;' > hashes.txt
Procurar os arquivos especificados pelo nome nos subdiretórios do diretório atual e removê-los:
find */ -type f -iname arquivo.ext -exec rm {} \;
Procurar todos os diretórios a partir do diretório atual que pertençam ao root e alterar o proprietário:
find . -user root -type d -exec chown fulano '{}' \;
Para executar o comando em mais de um arquivo de cada vez, ao invés da opção "-exec" deve-se utilizar o comando externo xargs, com sua entrada padrão sendo alimentada pela saída do comando find. Fica para um próximo artigo.
Esta opção do comando find é mais indicada quando forem executados comandos simples, pois uma limitação da opção "-exec" é que o comando é executado em um arquivo de cada vez.
Mas a opção "-exec" pode ser bastante perigosa pois um comando mal compreendido pode colocar em risco arquivos que não devem ser manipulados. Isto é especialmente importante se a opção "-exec" contém o comando rm ou outro comando destrutivo. Sendo assim, sempre teste o comando find usando a opção "-ls" ao invés da "-exec", para ver se os arquivos selecionados são mesmo o que deseja processar.
Para o find executar o comando em cada arquivo encontrado são necessárias duas artimanhas na sintaxe. Uma é que o comando que deseja executar precisa conter o argumento especial {}, que será substituído pelo nome do arquivo encontrado em cada invocação da ação "-exec". Outra é que é necessário existir um \; (ou ';') no final do comando (a barra invertida ou as aspas simples são necessárias pois senão o Shell interpretará o ponto-e-vírgula como fim do comando find). Se o parâmetro {} for o último item no comando então é necessário ter um espaço entre o {} e o \;. Pode ser necessário também proteger o argumento {}, consequentemente o nome do arquivo, com aspas simples, ficando '{}'. Veja alguns exemplos:
Procurar todos os arquivos a partir do diretório atual e descrever o tipo:
find . -type f -exec file '{}' \;
Procurar todos os arquivos a partir do diretório atual e alterar a permissão para 644:
find ./ -type f -exec chmod 644 {} \;
Procurar todos os arquivos a partir do diretório especificado e gerar o hash SHA1:
find diretório/ -type f -exec sha1sum '{} ;' > hashes.txt
Procurar os arquivos especificados pelo nome nos subdiretórios do diretório atual e removê-los:
find */ -type f -iname arquivo.ext -exec rm {} \;
Procurar todos os diretórios a partir do diretório atual que pertençam ao root e alterar o proprietário:
find . -user root -type d -exec chown fulano '{}' \;
Para executar o comando em mais de um arquivo de cada vez, ao invés da opção "-exec" deve-se utilizar o comando externo xargs, com sua entrada padrão sendo alimentada pela saída do comando find. Fica para um próximo artigo.