Как удалить все файлы в особенности папка, существующая в подпапках текущего каталога, исключая определенный файл?

Существует много сообщений, где люди, спрашивающие, как удалить файлы кроме, но мой вопрос более конкретен. Существует несколько названных папок 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
4
задан 9 June 2016 в 10:05

3 ответа

С 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
7
ответ дан 1 December 2019 в 09:03

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

  • код: удалите все файлы на 'пути' кроме '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)
2
ответ дан 1 December 2019 в 09:03

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

Удалить каждую подпапку и файл кроме __init__.py и дисплеи, какие файлы были удалены, пробуют следующие команды:

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

Для создания пустого файла просто добавьте следующую команду, кроме того:

> ./*/migrations/__init__.py

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

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

Примечание:

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

Предосторожность

Сделайте резервное копирование перед попыткой любой из команд. Никто не на 100% прекрасен в этом мире.

0
ответ дан 1 December 2019 в 09:03

Другие вопросы по тегам:

Похожие вопросы: