Como apagar o conteúdo dos diretórios (e não o próprio diretório) usando find -exec e rm?

7

Estou tentando excluir o conteúdo de alguns diretórios (mas não do próprio diretório) usando:

find -type d -name someDirs -exec rm -rf {}/* \;

Mas isso não funciona. Alguma dica?

    
por user1700840 31.12.2014 / 19:14

3 respostas

4

O problema com o seu comando é que a expansão de curingas é feita pelo seu shell antes que o comando seja realmente chamado. Como seu shell não encontra um arquivo que corresponda a {}/* (como você não tem um diretório com um nome literal {} no diretório atual), o * é passado para o comando inalterado, que será então modificado por find para excluir arquivos denominados literal * em seus diretórios someDirs , pois o comando rm não expandirá curingas (novamente). Você pode "depurar" isso executando

find -type d -name someDirs -exec echo rm -rf {}/* \;

em vez disso. Para ter certeza de que o shell tem a chance de expandir seu * , deixe exec gerar outro shell que pode expandir o * (e proteger o comando de ser expandido primeiro com aspas simples) assim:

find -type d -name someDirs -exec sh -c 'rm -rf {}/*' \;

ou teste assim:

find -type d -name someDirs -exec sh -c 'echo rm -rf {}/*' \;
    
por 01.01.2015 / 13:14
8

Você pode fornecer o diretório (ou diretórios) como argumentos para find e informá-lo para > pule com a opção -mindepth :

-mindepth levels
Do not apply any tests or actions at levels less than levels (a non-negative integer).
-mindepth 1 means process all files except the command line arguments.

Então, seu comando seria:

find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+
    
por 31.12.2014 / 22:42
6
  find . -type f -delete

excluirá todos os arquivos dentro e abaixo do diretório atual, deixando a estrutura de diretórios sozinha.

Se o seu comando find não suportar -delete (é um pouco moderno, mas já existia há alguns anos), então:

  find . -type f -exec rm {} \;

Edit: Como notado por Nate, esta não é a resposta certa.

    
por 31.12.2014 / 20:22

Tags