Esta pergunta é como uma fase II da primeira pergunta que publiquei aqui
Eu tenho um diretório que contém um monte de subdiretórios, arquivos .zip e outros arquivos aleatórios não contidos em um subdiretório.
Gostaria de um script de linha de comando para remover todos os subdiretórios do diretório pai, mas manter todos os arquivos zip e arquivos soltos que não pertencem a nenhum subdiretório. Todos os subdiretórios têm conteúdo, então acredito que precisaria forçar a exclusão deles 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 contidos em uma pasta.
Entendo que a exclusão de itens da linha de comando requer cuidados especiais, mas já tomei todas as precauções necessárias para fazer backup remotamente.
-r
,-R
,--recursive
São sinônimos que significa "diretórios remover e seus conteúdos de forma recursiva".rm -R ./*/
- Isso também evita problemas com nomes de hífen.Além da forma curinga, você também pode usar
find
(pelo menos a localização do GNU) para fazer isso:Como em outras
find
linhas, 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:
qualquer um dos quais moverá todo o material para em
../to-rm
vez de excluí-lo. Você pode verificar se fez o que queria,rm -Rf
o diretório que quiser.fonte
to-rm
efind
que lida com diretórios com bom gosto começando com um ponto (além de qualquer outro escape complicado). :)Você pode criar um script para algumas dessas sugestões, especialmente
rm -R -- */
, e mantê-lo na sua pasta / usr / local / bin; ou crie umalias
no seu arquivo ~ / .bashrc. Como é muito fácil digitar um comando incorretamente e quebrar seu sistema - mesmo uma única letra e / ou a ordem das letras podem resultar em consequências catastróficas - isso serviria como uma solução um pouco mais robusta do que ter que digitar as diferentes opções e argumentos cada vez que você deseja realizar esta tarefa.Além disso, convém incluir a opção
-i or --interactive=once
ou-I or --interactive=always
em seu script / comando, que servirá como outra ferramenta para evitar exclusões não intencionais.Além disso, algo como derobert sugerido seria o melhor; basta copiar / colar o script em um arquivo / editor de 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
rm -rf
comando.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.
Por fim, se as pastas estiverem vazias - nomes de arquivos essencialmente simples - você pode usar o
rmdir
comando para excluí-las. Não funciona para tudo o que você deseja excluir, mas será útil às vezes em que você desejar fazer uma "limpeza doméstica". ** Você pode tentar a-p --ignore-fail-on-non-empty
opção, que permitirá excluir determinados subdiretórios, bem como seus "pais" vazios - os diretórios nos quais eles residem.fonte
Primeiro, você precisa listar os diretórios e depois removê-los, sem prejudicar os arquivos normais, ls -d * /, lista apenas os subdiretórios, e canalizar com rm remove os diretórios e o conteúdo, mantendo intactos os arquivos soltos.
Este comando deve fazer o trabalho,
fonte
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
ajudaria (em shells ondeprintf
está embutido e nãols
) a solucionar erros muito grandes da lista arg , masls -d */ | xargs rm -rf
não adiciona nada AFAICT, exceto problemas adicionais." .."
(espaço..
), ele removeria o conteúdo do diretório pai com algumasls
implementações. E não se trata apenas de espaços, mas também de outros caracteres em branco, nova linha, aspas simples, aspas duplas, barra invertida e nomes de arquivos-
.printf
para gerar uma lista em que cada nome é encerrado pelo caractere nulo para que possa ser processadoxargs
com a-0
opção, aconselho que você edite sua resposta para atualizá-la com a variação dele. Eu ficaria bastante confiante de que ele ficaria feliz em você usar o snippet de código dele, se você o entender e aprender como ele protege contra comportamentos indesejáveis causados por determinados nomes de arquivos que poderiam existir.xargs
tem uma vantagem sobre a resposta aceita (funciona quando há um número muito grande de arquivos / diretórios no diretório atual), portanto há espaço para editar isso em uma resposta útil. Pessoalmente, achei que responder às perguntas do Stack Exchange é uma boa experiência de aprendizado - principalmente quando recebo feedback útil de outros usuários.rm -rf <directory name>
. Funciona. Basta digitarrm <directory name>
apenas leva a um número de subperguntas nas quais cada subdiretório deve ser removido manualmente. Mas,rm -rf
ajuda a remover o diretório inteiro junto com seus subdiretórios de uma só vez.fonte