Como apagar todos os arquivos na pasta particular presente nas subpastas do diretório atual excluindo um determinado arquivo?

4

Existem muitas postagens em que as pessoas perguntam como excluir arquivos, exceto as, mas minha pergunta é mais específica. Há várias pastas denominadas migrations nas subpastas do diretório atual, que contêm __init__.py e mais algumas. Como excluir todos os arquivos, exceto __init__.py , em todas as subpastas denominadas migrations da pasta atual?

UPD: E é possível sobrescrever __init__.py com arquivo vazio?

Estrutura de pastas:

├── folder_1
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
├── folder_2
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
├── folder_3
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
    
por Михаил Павлов 09.06.2016 / 04:49

3 respostas

7

com find :

find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete

Isso executa find no diretório atual ( . ) e:

  • para qualquer coisa que corresponda a migrations/__init__.py , ele executará o comando truncate . truncate -s 0 <file> reduz o arquivo para o tamanho 0 (vazio);
  • ao falhar nessa correspondência, para qualquer coisa que corresponda a migrations/* , ela será excluída;
  • o * em -path corresponde a / ao contrário do * no bash.

Exemplo:

$ tree                                                                                                                                   
.
├── folder_1
│   └── migrations
│       ├── 0001_initial.py
│       ├── __init__.py
│       └── __pycache__
│           ├── 0001_initial.cpython-35.pyc
│           └── __init__.cpython-35.pyc
├── folder_2
│   └── migrations
│       ├── 0001_initial.py
│       ├── __init__.py
│       └── __pycache__
│           ├── 0001_initial.cpython-35.pyc
│           └── __init__.cpython-35.pyc
└── folder_3
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    └── migrations
        ├── 0001_initial.py
        ├── __init__.py
        └── __pycache__
            ├── 0001_initial.cpython-35.pyc
            └── __init__.cpython-35.pyc

9 directories, 15 files
$ find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete                
$ tree                                                                                              
.
├── folder_1
│   └── migrations
│       └── __init__.py
├── folder_2
│   └── migrations
│       └── __init__.py
└── folder_3
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    └── migrations
        └── __init__.py

6 directories, 6 files

$ wc -l */migrations/__init__.py
0 folder_1/migrations/__init__.py
0 folder_2/migrations/__init__.py
0 folder_3/migrations/__init__.py
0 total
    
por muru 09.06.2016 / 08:35
2

Crie um arquivo .py, edite o caminho (diretório em que você trabalhará) e compile-o (python3).

  • code: exclua todos os arquivos em 'path', exceto 'target_file' dentro de 'target_folder', que são apenas claros (vazios).
import os, sys
path='/home/vitor/Desktop/teste/'
target_folder='migrations'
target_file='__init__.py'

for directory, subdirs, files in os.walk(path):
    for file_name in files:
        folder_name=os.path.split(os.path.abspath(directory))[-1]
        if(folder_name==target_folder and file_name==target_file):
            open(directory+'/'+file_name, 'w').close()
        else:
            os.remove(directory+'/'+file_name)
    
por Vitor Abella 09.06.2016 / 06:46
0

Aqui está um comando mais simples. Eu sei que alguém já respondeu a pergunta, mas esses comandos devem ser mais simples e únicos. Experimente-os para ver se funcionam.

Para remover todas as subpastas e arquivos, exceto __init__.py , e exibir quais arquivos foram excluídos, tente os seguintes comandos:

rm -rfv ./*/migrations/!(__init__.py)

Para criar um arquivo vazio, basta adicionar o seguinte comando:

> ./*/migrations/__init__.py

O comando acima é como gravar dados vazios em um arquivo da seguinte forma:

/dev/null > ./*/migrations/__init__.py

Nota

Todos esses comandos são executados no diretório atual .

Precaução

Por favor, faça um backup antes de tentar qualquer um dos comandos. Ninguém é 100% perfeito neste mundo.

    
por Ankanna 09.06.2016 / 12:34