Como apagar todos os arquivos / pastas da pasta, exceto algumas pastas?

3

Suponha que eu tenha uma estrutura de diretórios da seguinte forma:

application
│
├── config
│   ├── c1.conf
│   └── c2.conf
│
├── logs
│   ├── l1.txt
│   └── l2.txt
│
└── src
    ├── static
    ├── s1.py
    └── s2.py

Agora, desejo excluir todas as pastas, exceto config e logs (nesse caso, apenas src ). meu PWD é atualmente pai de appliaction/ dir (por exemplo, eu posso ver application em meu PWD ).

Qual comando devo usar? (Eu tentei com rm -rf com algumas opções, mas erroneamente apagou outros arquivos, então eu gostaria de saber a resposta correta antes de tentar qualquer outra coisa!)

    
por Sangram 08.08.2014 / 09:07

4 respostas

7

Experimente find ./application/ -type d -not -name config -not -name logs .

Se isso retornar os diretórios apropriados, execute

find ./application/ -type d -not -name config -not -name logs -exec rm -R {} \;

O exec rm -R {} \; no final remove o diretório, mesmo que não esteja vazio.

    
por Jos 08.08.2014 / 09:22
1

Desta forma, é um pouco mais de trabalho do que algumas outras soluções possíveis, mas quando eu estou excluindo arquivos eu gosto de poder checar o que está indo embora para sempre. Os passos abaixo pressupõem que você pode ver "aplicativo" no seu PWD, conforme indicado na sua pergunta.

Primeiro, crie um novo arquivo de texto contendo os nomes de todas as pastas que você deseja manter (não excluir), com uma pasta por linha. Salve-o como to-keep.txt , por exemplo:

config
logs

Em seguida, copie o seguinte em um editor de texto e salve-o como rm-exclude.sh para que todos os três arquivos estejam no mesmo diretório.

#!/usr/bin/env bash

find "./" -maxdepth 1 -type d ! -path "./" > to-delete.txt

dels='cat to-delete.txt'
readarray -t keeps < to-keep.txt

for keep in "${keeps[@]}"; do
    dels='echo "$dels" | grep -v "$keep"'
done

echo "$dels" > to-delete.txt

Torne-o executável usando:

chmod +x rm-exclude.sh

Em seguida, execute-o com o seguinte, em que PATH é o caminho para a pasta "aplicativo" do seu PWD. No seu exemplo, PATH seria simplesmente application .

./rm-exclude.sh PATH

Por fim, confira to-delete.txt para ter certeza de que nada está sendo excluído e que não deveria ser, e execute:

readarray -t dels < to-delete.txt; for del in "${dels[@]}"; do rm -rf "$del"; done

Se você não se preocupa em verificar o conteúdo do arquivo txt, basta copiar e colar o comando acima até o final de rm-exclude.sh , para que a execução do script faça tudo, desde que você tenha to-keep.txt cheio. O resultado final deve ser que todas as subpastas diretas de application não em to-keep.txt serão excluídas, junto com seu conteúdo.

    
por TheSchwa 08.08.2014 / 10:14
1

Com base na resposta do Jos , eu uso isso para excluir todos os arquivos e diretórios apenas no diretório atual, exceto pelo .git directory.

sudo find /home/jeffy/django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} \;

Na verdade, fiquei com medo e achei que isso também excluiu o diretório .git , mas esqueci de usar o sinalizador a com la ( ls -la ).

O mindepth flag é para evitar a exclusão do próprio diretório raiz. O -maxdepth impede que todos os subdiretórios e arquivos sejam retornados, que são redundantes com o sinalizador f .

(Além disso, nunca use caminhos relativos ao usar rm -r !)

    
por aliteralmind 09.01.2015 / 18:03
0

O que farei com o meu shell (zsh) é o seguinte (mas acho que com o bash ther é algo equivalente).

  1. Digite

    echo application/*(/) 
    

e, sem bater o retorno , pressione TAB .

  1. o shell expandirá o padrão glob; Nesse caso, uma lista de todos os diretórios em application ; a linha deve estar agora

    echo application/config application/logs application/src
    
  2. Agora eu editaria a linha para remover os diretórios que quero manter.

  3. Triplo, verifique e edite o echo inicial para rm -rf .

  4. Eu verifico novamente e ...

  5. ... aperte o retorno.

De qualquer forma, esse tipo de tarefa (selecionar arquivos manuais ou pastas para aplicar ação a eles) é realmente melhor feito com algum tipo de auxílio visual, a menos que você seja um nerd de linha de comando como eu ... por exemplo As pessoas gostam muito do Midnight Commander .

    
por Rmano 08.08.2014 / 09:22

Tags