Encontre e exclua todos os diretórios chamados “test” no linux

32

Eu tenho muitos diretórios chamados "teste" e gostaria de removê-los.

Eu sei como encontrá-los e imprimi-los usando:

find . -name test -print

Agora, como remover os diretórios?

Por favor, note que eu tenho arquivos no diretório e eles também devem ser removidos.

    
por garbage collection 31.05.2013 / 21:36

7 respostas

67

xargs faz toda a mágica:

find . -name test -type d -print0|xargs -0 rm -r --

xargs executa o comando passado como parâmetros, com os argumentos passados para stdin.

Isso está usando rm -r para excluir o diretório e todos os seus filhos.

O -- denota o fim dos argumentos, para evitar um caminho começando com - de ser tratado como um argumento.

-print0 informa find para imprimir -0 caracteres em vez de novas linhas; e xargs informa rm para tratar apenas rm como separador de argumentos.

Isso está chamando find com muitos diretórios de uma vez, evitando a sobrecarga de chamar rm separadamente para cada diretório.

Como alternativa, + também pode executar um comando para cada arquivo selecionado :

find . -name test -type d -exec rm -r {} \;

E este, com melhor desempenho, já que chamará xargs com vários diretórios ao mesmo tempo :

find . -name test -type d -exec rm -r {} +

(Observe o %code% no final; este é equivalente à solução %code% .)

    
por 31.05.2013 / 21:38
22
find /path/to/dir -name "test" -type d -delete
  • -name: procura o nome passado. Você pode usar -regex para fornecer nomes com base em expressões regulares

  • -type: procura tipos de arquivo. d apenas procura diretórios

  • -delete: ação que exclui a lista encontrada.

Alternativamente:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Como J.F. Sebastian afirmou nos comentários:

Você pode usar + em vez de \; para passar mais de um diretório por vez.

    
por 31.05.2013 / 21:38
7

ainda outra maneira de fazer isso é

find . -name test -exec rm -R "{}" \;

Um link útil para encontrar: link

    
por 31.05.2013 / 21:44
5

Você também pode usar a opção -exec

find . -name test -exec rm {} \;
    
por 31.05.2013 / 21:44
2

Suponha que você esteja usando o find do gnu , você pode usar a opção -delete:

find . -name test -delete

que é mais fácil de lembrar.

    
por 11.08.2014 / 00:50
2

Como outra resposta aponta, você pode tentar encontrar todos os diretórios com o nome test e excluí-los

find -name "test" -type d -delete

Eu tive alguns problemas com compatibilidade cruzada no Mac, então usei este comando equivalente:

find -path "*/test" -type d -delete
  • -path : procura um padrão no nome completo do arquivo.

Em qualquer caso, no entanto, se algum dos diretórios com o nome test tiver arquivos, find irá reclamar que Directory is not empty e não conseguirá remover o diretório.

Se você pretendia excluir todos os arquivos incluindo o diretório test , então podemos usar o mesmo truque para excluir todos os arquivos dentro dos diretórios chamados test first.

find -path "*/test/*" -delete

O padrão: "*/test/*" , garantirá que apenas deletemos arquivos dentro de um diretório chamado /test/ . Uma vez que os diretórios estão vazios, podemos ir em frente e deletar os diretórios usando o primeiro comando:

find -path "*/test" -type d -delete

Exemplo:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
    
por 19.10.2015 / 23:39
2

Assumindo o bash 4 +

shopt -s globstar
rm -r ./**/test/

A barra à direita significa que ela corresponderá apenas aos diretórios. O teste é antecipadamente com:

printf '%s\n' ./**/test/
    
por 01.06.2013 / 13:05