
Es gibt viele Beiträge, in denen Leute fragen, wie man Dateien außer einigen löscht, aber meine Frage ist spezifischer. Es gibt mehrere Ordner migrations
in den Unterordnern des aktuellen Verzeichnisses, die __init__.py
Dateien und noch mehr enthalten. Wie lösche ich alle Dateien außer __init__.py
den Unterordnern, die migrations
nach dem aktuellen Ordner benannt sind?
UPD: Und ist es möglich, __init__.py
mit einer leeren Datei zu überschreiben?
Ordnerstruktur:
├── 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
Antwort1
Mit find
:
find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete
Dies wird find
im aktuellen Verzeichnis ( .
) ausgeführt und:
- für alles, was übereinstimmt
migrations/__init__.py
, wird dertruncate
Befehl ausgeführt.truncate -s 0 <file>
Reduziert die Datei auf die Größe 0 (leer); - wenn die Übereinstimmung fehlschlägt,
migrations/*
wird alles, was übereinstimmt, gelöscht. - die
*
in-path
Übereinstimmungen/
im Gegensatz zu den*
in Bash.
Beispiel:
$ 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
Antwort2
Erstellen Sie eine PY-Datei, bearbeiten Sie den Pfad (Verzeichnis, in dem Sie arbeiten werden) und kompilieren Sie sie (python3).
- Code: Löschen Sie alle Dateien im „Pfad“ außer der „Zieldatei“ im „Zielordner“, die gerade gelöscht (leer) ist.
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)
Antwort3
Hier ist ein einfacherer Befehl. Ich weiß, dass jemand die Frage bereits beantwortet hat, aber diese Befehle sollten einfacher und eindeutiger sein. Probieren Sie sie aus, um zu sehen, ob sie funktionieren.
Um alle Unterordner und Dateien außer „+“ zu entfernen __init__.py
und anzuzeigen, welche Dateien gelöscht wurden, versuchen Sie die folgenden Befehle:
rm -rfv ./*/migrations/!(__init__.py)
Um eine leere Datei zu erstellen, fügen Sie einfach den folgenden Befehl zusätzlich hinzu:
> ./*/migrations/__init__.py
Der obige Befehl entspricht dem Schreiben leerer Daten in eine Datei, etwa wie folgt:
/dev/null > ./*/migrations/__init__.py
Notiz
Alle diese Befehle werden vom aktuellen Verzeichnis aus ausgeführt.
Vorsicht
Bitte erstellen Sie eine Sicherungskopie, bevor Sie einen der Befehle ausprobieren. Niemand auf dieser Welt ist 100 % perfekt.