Примечание

Примечание

Есть много постов, где люди спрашивают, как удалить файлы, кроме одного, но мой вопрос более конкретен. Есть несколько папок, названных migrationsв подпапках текущего каталога, которые содержат __init__.pyфайл и еще несколько. Как удалить все файлы, кроме __init__.pyвсех подпапок, названных migrationsв текущей папке?

UPD: А можно ли перезаписать __init__.pyпустой файл?

Структура папок:

├── 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

решение1

С find:

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

Это выполняется findв текущем каталоге ( .), и:

  • для всего, что соответствует migrations/__init__.py, команда будет выполнена truncate. truncate -s 0 <file>уменьшает размер файла до 0 (пустой);
  • в случае отсутствия совпадения все совпадающие элементы migrations/*будут удалены;
  • в *матчах в отличие от -pathв bash./*

Пример:

$ 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

решение2

Создайте файл .py, отредактируйте путь (каталог, с которым вы будете работать) и скомпилируйте его (python3).

  • код: удалить все файлы по пути «path», кроме «target_file» внутри «target_folder», которые просто очищены (пусты).
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)

решение3

Вот более простая команда. Я знаю, что кто-то уже ответил на этот вопрос, но эти команды должны быть проще и уникальнее. Попробуйте их, чтобы увидеть, работают ли они.

Чтобы удалить все подпапки и файлы, за исключением __init__.pyи отображения удаленных файлов, попробуйте выполнить следующие команды:

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

Чтобы создать пустой файл, просто добавьте следующую команду:

> ./*/migrations/__init__.py

Приведенная выше команда аналогична записи пустых данных в файл следующим образом:

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

Примечание

Все эти команды выполняются из текущего каталога..

Меры предосторожности

Пожалуйста, сделайте резервную копию, прежде чем пробовать любую из команд. Никто не идеален на 100% в этом мире.

Связанный контент