Nota

Nota

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 migrationsen las subcarpetas del directorio actual, que contienen __init__.pyarchivos y algo más. ¿Cómo eliminar todos los archivos excepto __init__.pyen todas las subcarpetas nombradas migrationsen la carpeta actual?

UPD: ¿Y es posible sobrescribir __init__.pycon 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 finden el directorio actual ( .) y:

  • para cualquier cosa que coincida migrations/__init__.py, ejecutará el truncatecomando. 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 -pathcoincide /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__.pyy 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.

información relacionada