
Есть много постов, где люди спрашивают, как удалить файлы, кроме одного, но мой вопрос более конкретен. Есть несколько папок, названных 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% в этом мире.