Como remover pastas com um determinado nome

139

No Linux, como removo pastas com um determinado nome que estão aninhadas profundamente na hierarquia de pastas?

Os seguintes caminhos estão em uma pasta e eu gostaria de remover todas as pastas nomeadas a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Qual comando do Linux devo usar na pasta pai?

Joe
fonte
Talvez não entenda bem, mas talvez ajude alguém: tenho 410 pastas em uma pasta principal - cada uma das 410 com duas subpastas. Todas as primeiras subpastas são nomeadas 'final' e contêm pdfs editados e uma lista de conteúdo do Word. Todas as segundas subpastas denominadas tif_pdf_various_names contêm arquivos tiff salvos em tiff originalmente digitalizados (cerca de 200 páginas), seus PDFs não editados e uma minuta da lista de conteúdo .docx - portanto, uma coleção de trabalhos domésticos. Eu precisava fazer uma coleção das 410 pastas que continham apenas o material finalmente editado - com os tiffs próximos a 4 TB. O método mais fácil encontrado foi o de usar (em Micr
Jurie 5/19/19

Respostas:

155

Se o diretório de destino estiver vazio, use find, filtre apenas diretórios, filtre por nome, execute rmdir:

find . -type d -name a -exec rmdir {} \;

Se você deseja excluir recursivamente seu conteúdo, substitua -exec rmdir {} \;por -deleteou -prune -exec rm -rf {} \;. Outras respostas incluem detalhes sobre essas versões, credite-as também.

pistache
fonte
9
Poderia explicar o que {} \;faz?
winklerrr
6
{}pode ser lido como "para cada arquivo / pasta correspondente" - ou seja, substitui cada arquivo / pasta "encontrado". \;é um terminador para a -execcláusula.
wmorrison365
2
Isso me dá um erro de "não é possível excluir" quando o diretório não está vazio #
101319
1
Considere adicionar -prunesinalizador à resposta, de acordo com a sugestão de @David Grayson. Sem isso, findainda tentará visitar a pasta que está faltando e, eventualmente, sairá com um código de erro, que pode, por exemplo, falhar na compilação do Docker.
Czyzby 18/03
160

Use find para o nome "a" e execute rm para remover os nomes de acordo com seus desejos, da seguinte maneira:

find . -name a -exec rm -rf {} \;

Teste primeiro usando ls para listar:

find . -name a -exec ls {} \;

Para garantir que isso remova apenas diretórios e não arquivos simples, use o argumento "-type d" (conforme sugerido nos comentários):

find . -name a -type d -exec rm -rf {} \;

O "{}" é uma substituição para cada arquivo "a" encontrado - o comando exec é executado contra cada um por substituição.

wmorrison365
fonte
4
Você provavelmente deseja adicionar um "-type d", apenas no caso de um arquivo corresponder ao mesmo nome.
22612 Mark-Loeser
3
Também nota que este vai pegar algo como 1/2/a/3/4, que não podem ser destinados, por isso, uma para a recomendação de teste de primeira ...
twalberg
9
reco echo {}testá-lo primeiro, em vez de #ls {}
Charney Kaye
2
Aqui vai o meu node_modules/.
saruftw
6
Eu usei find . -name a -type d -exec rm -rf {} \;e funcionou, embora impresso find: ‘./subdir/subdir/a’: No such file or directorypara cada diretório excluído.
Pacoverflow 19/03/19
59

Isso também funciona - ele removerá todas as pastas chamadas "a" e seu conteúdo:

rm -rf `find -type d -name a`
Arash Fotouhi
fonte
@Buffalo, como é que é? Esta defo funciona, mas os outros também. Ficaria surpreso ao encontrar um ambiente onde isso funcione, mas os outros não deram todas as respostas find/rm.
Wmorrison365
4
@ wmorrison365 porque, se o fizer find . -name a -exec rm -rf {} \;, o find irá falhar quando tentar entrar nesse diretório para procurar mais itens, causando um erro como find: '1/2/3/a': No such file or directory.
Alex Grönholm
@Alex Grönholm, com certeza, mas todas as pastas denominadas 'a' são excluídas. Como você afirma, o find não pode procurar posteriormente dentro de uma pasta 'a' excluída, mas isso não importa. Deseja manter o conteúdo de 'a' para processamento subsequente antes da exclusão é um caso de uso diferente do que o OP pediu.
precisa saber é o seguinte
6
@ wmorrison365 Sim, os diretórios foram excluídos, mas não acho bom recomendar uma solução em que o comando falhe (retorna um código de saída diferente de zero).
Alex Grönholm
1
Isso estava me dando um erro illegal option --t. Eu também tive que passar o diretório para pesquisar ( stackoverflow.com/questions/25840713/… ):rm -rf `find . -type d -name a` .
Steve Harrison
25

Para excluir todos os diretórios com o nome foo, execute:

find -type d -name foo -a -prune -exec rm -rf {} \;

As outras respostas estão faltando uma coisa importante: a -pruneopção. Sem -prune, o GNU find excluirá o diretório com o nome correspondente e tentará recursá-lo para encontrar mais diretórios correspondentes. A -pruneopção informa para não recursar em um diretório que corresponda às condições.

David Grayson
fonte
21

Acabei aqui procurando excluir minhas node_modulespastas antes de fazer um backup do meu trabalho em andamento usando rsync. Um dos principais requisitos é que a node_modulespasta possa ser aninhada, portanto, você precisa do-prune opção

Primeiro, executei isso para verificar visualmente as pastas a serem excluídas:

find -type d -name node_modules -prune

Então eu executei isso para excluir todos eles:

find -type d -name node_modules -prune -exec rm -rf {} \;

Graças a pistache

mpalumbo7
fonte
Ahh que funcionou muito bem, para fazer algo que você pode usar com facilidade você pode salvar isso como um pouco shellscript: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell
11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Deve fazer o truque. AVISO, se você acidentalmente bombear um .ou /para xargs rm -Rfo computador inteiro, será excluído sem a opção de recuperá-lo, exigindo uma reinstalação do SO.

Slevin
fonte
2
Oh, apenas esse pequeno risco. Isso é tudo? Haha Super obrigado pelo aviso. Eu definitivamente cometeria esse erro de digitação.
usar o seguinte código
9

Eu tinha mais de 100 arquivos como

log-12
log-123
log-34
....

as respostas acima não funcionaram para mim

mas o comando a seguir me ajudou.

find . -name "log-*" -exec rm  -rf {} \;

eu dei -typecomo .assim ele exclui os arquivos e pastas que começa comlog-

e rm -rf exclui pastas recursivamente, mesmo que tenha arquivos.

se você quer pastas sozinhas

find -type d -name "log-*" -exec rm  -rf {} \;

arquivos sozinhos

find -type f -name "log-*" -exec rm  -rf {} \;
Thamaraiselvam
fonte
8

Combinando várias respostas, eis um comando que funciona no Linux e no MacOS

rm -rf $(find . -type d -name __pycache__)
marcosfede
fonte
Apenas um que funcionou para mim que também não
gerou
7

Outro:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)
dgrigonis
fonte
3
Esta resposta funciona apenas para pastas vazias. -deletenão remove pastas não vazias.
Maninak
Obrigado por adicionar a versão OSX
schu34
6

Este comando funciona para mim. Faz seu trabalho recursivamente

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - pasta atual

"node_modules" - nome da pasta

1nstinct
fonte
-2

encontre o caminho / para / as pastas -maxdepth 1 -name "my_ *" -type d -delete

PickleRick
fonte