quinta-feira, 29 de julho de 2010

Usando o comando find com a opção exec

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.

Nenhum comentário:

Postar um comentário