
Hay muchas publicaciones en las que la gente pregunta cómo eliminar archivos excepto algunos, pero mi pregunta es más específica. Hay varias carpetas nombradas migrations
en las subcarpetas del directorio actual, que contienen __init__.py
archivos y algo más. ¿Cómo eliminar todos los archivos excepto __init__.py
en todas las subcarpetas nombradas migrations
en la carpeta actual?
UPD: ¿Y es posible sobrescribir __init__.py
con un archivo vacío?
Estructura de carpetas:
├── 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
Respuesta1
Con find
:
find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete
Esto se ejecuta find
en el directorio actual ( .
) y:
- para cualquier cosa que coincida
migrations/__init__.py
, ejecutará eltruncate
comando.truncate -s 0 <file>
reduce el archivo al tamaño 0 (vacío); - si no se logra esa coincidencia, cualquier cosa que coincida
migrations/*
, la eliminará; - el
*
in-path
coincide/
a diferencia del*
in bash.
Ejemplo:
$ 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
Respuesta2
Cree un archivo .py, edite la ruta (directorio en el que trabajará) y compílelo (python3).
- código: elimine todos los archivos en la 'ruta' excepto 'target_file' dentro de 'target_folder', que están simplemente claros (vacíos).
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)
Respuesta3
Aquí hay un comando más simple. Sé que alguien ya respondió la pregunta, pero estos comandos deberían ser más simples y únicos. Pruébelos para ver si funcionan.
Para eliminar todas las subcarpetas y archivos, excepto __init__.py
y mostrar qué archivos se han eliminado, pruebe los siguientes comandos:
rm -rfv ./*/migrations/!(__init__.py)
Para crear un archivo vacío, simplemente agregue el siguiente comando además:
> ./*/migrations/__init__.py
El comando anterior es como escribir datos vacíos en un archivo como el siguiente:
/dev/null > ./*/migrations/__init__.py
Nota
Todos estos comandos se ejecutan desde el directorio actual..
Precaución
Haga una copia de seguridad antes de probar cualquiera de los comandos. Nadie es 100% perfecto en este mundo.