Recentemente, fui confrontado com a tarefa de excluir todos os arquivos / pastas em um diretório, excluindo aqueles que correspondiam a um padrão específico. Então, criei um comando unix de linha única para fazer o trabalho. Deve ser apenas uma linha? Suponho que não, mas é definitivamente mais legal assim!
Embora o problema seja bastante simples, fiquei um pouco surpreso com a complexidade da minha solução. Aqui está o comando que eu usei; NOTA: esta é uma solução ruim porque não lida com nomes de arquivos contendo caracteres de feed de linha (o que não importava na minha situação).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Eu não usei o comando "find" porque não quero recursar em pastas correspondentes a PATTERN. Por exemplo, considere a seguinte estrutura de arquivo:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
O uso do padrão "foo" deve remover apenas "first_dir" (e seu conteúdo, é claro) e "somefile.txt" ( não "anotherfile.txt" ou "morefiles.log").
Pergunta, existem maneiras melhores (mais elegantes e corretas) de conseguir isso?
EDIT:
Recentemente, soube que "encontrar" pode ser uma opção melhor :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Esta solução manipula corretamente caminhos contendo caracteres de alimentação de linha.