Como eu removo todos os subdiretórios de dentro de um diretório?

43

Esta questão é uma espécie de fase II para a primeira pergunta que publiquei em aqui

Eu tenho um diretório que contém vários sub-diretórios, arquivos .zip e outros arquivos aleatórios que não estão contidos em um subdiretório.

Gostaria que um script de linha de comando removesse todos os subdiretórios do diretório pai, mas mantenha todos os arquivos zip e soltos que não pertencem a nenhum subdiretório. Todos os subdiretórios têm conteúdo, então acredito que precisaria forçar sua exclusão com o comando -f.

Então, basicamente, um comando que olha dentro do diretório pai (ou diretório atual), exclui todas as pastas de dentro dele, mas mantém todos os outros conteúdos e arquivos que não são uma pasta ou estão contidos em uma pasta.

Entendo que excluir itens da linha de comando requer cuidados especiais, mas já tomei todas as precauções necessárias para fazer o backup remotamente.

    
por Evster 22.03.2013 / 22:16

5 respostas

54

No BASH, você pode usar a barra final (acho que ele deve funcionar em qualquer shell POSIX):

rm -R -- */

Observe o -- que separa opções de argumentos e permite remover entradas iniciando com um hífen - caso contrário, após a expansão pelo shell, o nome da entrada seria interpretado como uma opção por rm (o mesmo vale para muitos outros utilitários de linha de comando).

Adicione a opção -f se você não quiser ser solicitado a confirmar ao excluir arquivos não graváveis.

Observe que, por padrão, os diretórios ocultos (aqueles cujo nome começa com . ) serão deixados em paz.

Uma ressalva importante: a expansão de */ também incluirá links simbólicos que eventualmente serão resolvidos para arquivos do tipo diretório . E dependendo da implementação de rm , rm -R -- thelink/ irá simplesmente deletar o symlink, ou (na maioria deles) deletará o conteúdo do diretório vinculado de forma recursiva, mas não o próprio diretório nem o symlink.

Se estiver usando zsh , uma abordagem melhor seria usar um glob qualifier para selecionar apenas arquivos do tipo diretório:

rm -R -- *(/) # or *(D/) to include hidden ones

ou:

rm -R -- *(-/)

para incluir links simbólicos para diretórios (mas porque, desta vez, a expansão não possui / s, é apenas o link simbólico que é removido com todas as implementações rm ).

Com bash , AT & T ksh , yash ou zsh você pode fazer:

set -- */
rm -R -- "${@%/}"

para remover o / .

    
por 22.03.2013 / 22:23
13

Além do modo curinga, você também pode usar find (pelo menos o GNU find) para fazer isso:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

Como em outras linhas find , você pode executar a primeira parte ( find -mindepth 1 -maxdepth 1 -type d ) para ver uma lista de diretórios que serão removidos.

Uma opção mais segura é fazer algo assim:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

qualquer uma das quais moverá todas as coisas para ../to-rm em vez de excluí-las. Você pode verificar se fez o que queria, eles rm -Rf do diretório que você preferir.

    
por 22.03.2013 / 23:00
4

Você pode querer criar um script para algumas dessas sugestões, especialmente rm -R -- */ , e mantê-lo em sua pasta / usr / local / bin; ou crie um alias no seu arquivo ~ / .bashrc. Como é tão fácil de digitar um comando e quebrar seu sistema - até mesmo uma única letra e / ou a ordem das letras podem resultar em conseqüências catastróficas - isso serviria como uma solução um pouco mais robusta do que ter para digitar as diferentes opções e argumentos cada vez que você quiser realizar essa tarefa.

Além disso, você pode incluir a opção -i or --interactive=once ou -I or --interactive=always no seu script / comando, que servirá como outra ferramenta para evitar exclusões indesejadas.

Além disso, algo como derobert sugerido seria melhor; basta copiar / colar o script em um editor de arquivo / terminal e ajustá-lo às suas necessidades específicas, e os arquivos / diretórios serão movidos para um único diretório (cujo conteúdo você pode verificar / verificar) que você pode simplesmente remover emitindo o comando rm -rf .

Outra opção é usar um aplicativo GUI, como o gerenciador de arquivos, e simplesmente selecionar todos os arquivos / pastas aplicáveis que você deseja excluir. Verifique as páginas de manual da sua distribuição se você não tiver permissões.

Finalmente, se as pastas estiverem vazias - essencialmente nomes de arquivos simples - você pode usar o comando rmdir para excluí-las. Não funciona para tudo o que você deseja excluir, mas será útil quando você quiser fazer uma "limpeza doméstica". ** Você pode querer experimentar a opção -p --ignore-fail-on-non-empty , que permitirá que você exclua certos subdiretórios, assim como seus "pais" vazios - os diretórios nos quais eles residem.

    
por 23.03.2013 / 01:15
0

Primeiro você precisa listar os diretórios e, em seguida, removê-los, sem prejudicar os arquivos normais, ls -d * /, apenas lista os subdiretórios, e canalizá-lo com rm remove os diretórios e conteúdos, mantendo os arquivos soltos intactos .

Este comando deve fazer o trabalho,

ls -d  */ | xargs rm -rf
    
por 18.09.2017 / 10:21
-1

rm -rf <directory name> . Funciona. Apenas digitar rm <directory name> apenas leva ao número de subquestões nas quais cada sub-diretório deve ser removido manualmente. Mas, rm -rf ajuda na remoção de todo o diretório junto com seus subdiretórios de uma só vez.

    
por 07.03.2017 / 19:20