
Existem muitos posts onde as pessoas perguntam como excluir arquivos, exceto alguns, mas minha pergunta é mais específica. Existem várias pastas nomeadas migrations
nas subpastas do diretório atual, que contêm __init__.py
arquivos e mais alguns. Como excluir todos os arquivos, exceto __init__.py
todas as subpastas nomeadas migrations
na 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
Responder1
Com find
:
find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete
Isso é executado find
no diretório atual ( .
) e:
- para qualquer coisa correspondente
migrations/__init__.py
, ele executará otruncate
comando.truncate -s 0 <file>
reduz o arquivo para tamanho 0 (vazio); - na falta dessa correspondência, para qualquer correspondência
migrations/*
, ele será excluído; - o
*
in-path
corresponde/
ao contrário do*
in 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
Responder2
Crie um arquivo .py, edite o caminho (diretório que você irá trabalhar) e compile-o (python3).
- código: exclua todos os arquivos em 'caminho', exceto 'target_file' dentro de 'target_folder', que estão apenas limpos (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)
Responder3
Aqui está um comando mais simples. Sei que alguém já respondeu à pergunta, mas esses comandos deveriam ser mais simples e exclusivos. 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 como segue:
/dev/null > ./*/migrations/__init__.py
Observação
Todos esses comandos são executados no diretório atual.
Precaução
Faça um backup antes de tentar qualquer um dos comandos. Ninguém é 100% perfeito neste mundo.