Существует много сообщений, где люди, спрашивающие, как удалить файлы кроме, но мой вопрос более конкретен. Существует несколько названных папок 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
С 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
соответствия /
в отличие от этого, *
в ударе.Пример:
$ 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
Создайте .py файл, отредактируйте путь (каталог, что Вы будете работать), и скомпилируйте его (python3).
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)
Вот более простая команда. Я знаю, что кто-то уже ответил на вопрос, но эти команды должны быть более простыми и уникальными. Судите их, чтобы видеть, работают ли они.
Удалить каждую подпапку и файл кроме __init__.py
и дисплеи, какие файлы были удалены, пробуют следующие команды:
rm -rfv ./*/migrations/!(__init__.py)
Для создания пустого файла просто добавьте следующую команду, кроме того:
> ./*/migrations/__init__.py
Вышеупомянутая команда точно так же, как пишет пустые данные в файл как следующим образом:
/dev/null > ./*/migrations/__init__.py
Все эти команды выполняются из текущего каталога .
Сделайте резервное копирование перед попыткой любой из команд. Никто не на 100% прекрасен в этом мире.