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?
Respostas:
Se o diretório de destino estiver vazio, use find, filtre apenas diretórios, filtre por nome, execute rmdir:
Se você deseja excluir recursivamente seu conteúdo, substitua
-exec rmdir {} \;
por-delete
ou-prune -exec rm -rf {} \;
. Outras respostas incluem detalhes sobre essas versões, credite-as também.fonte
{} \;
faz?{}
pode ser lido como "para cada arquivo / pasta correspondente" - ou seja, substitui cada arquivo / pasta "encontrado".\;
é um terminador para a-exec
cláusula.-prune
sinalizador à resposta, de acordo com a sugestão de @David Grayson. Sem isso,find
ainda 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.Use find para o nome "a" e execute rm para remover os nomes de acordo com seus desejos, da seguinte maneira:
Teste primeiro usando ls para listar:
Para garantir que isso remova apenas diretórios e não arquivos simples, use o argumento "-type d" (conforme sugerido nos comentários):
O "{}" é uma substituição para cada arquivo "a" encontrado - o comando exec é executado contra cada um por substituição.
fonte
1/2/a/3/4
, que não podem ser destinados, por isso, uma para a recomendação de teste de primeira ...echo {}
testá-lo primeiro, em vez de #ls {}
node_modules/
.find . -name a -type d -exec rm -rf {} \;
e funcionou, embora impressofind: ‘./subdir/subdir/a’: No such file or directory
para cada diretório excluído.Isso também funciona - ele removerá todas as pastas chamadas "a" e seu conteúdo:
fonte
find/rm
.find . -name a -exec rm -rf {} \;
, o find irá falhar quando tentar entrar nesse diretório para procurar mais itens, causando um erro comofind: '1/2/3/a': No such file or directory
.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`
.Para excluir todos os diretórios com o nome
foo
, execute:As outras respostas estão faltando uma coisa importante: a
-prune
opçã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-prune
opção informa para não recursar em um diretório que corresponda às condições.fonte
Acabei aqui procurando excluir minhas
node_modules
pastas antes de fazer um backup do meu trabalho em andamento usandorsync
. Um dos principais requisitos é que anode_modules
pasta possa ser aninhada, portanto, você precisa do-prune
opçãoPrimeiro, executei isso para verificar visualmente as pastas a serem excluídas:
Então eu executei isso para excluir todos eles:
Graças a pistache
fonte
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
Deve fazer o truque. AVISO, se você acidentalmente bombear um
.
ou/
paraxargs rm -Rf
o computador inteiro, será excluído sem a opção de recuperá-lo, exigindo uma reinstalação do SO.fonte
Eu tinha mais de 100 arquivos como
as respostas acima não funcionaram para mim
mas o comando a seguir me ajudou.
eu dei
-type
como.
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
arquivos sozinhos
fonte
Combinando várias respostas, eis um comando que funciona no Linux e no MacOS
fonte
Outro:
fonte
-delete
não remove pastas não vazias.Este comando funciona para mim. Faz seu trabalho recursivamente
. - pasta atual
"node_modules" - nome da pasta
fonte
encontre o caminho / para / as pastas -maxdepth 1 -name "my_ *" -type d -delete
fonte