Notiz

Notiz

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 migrationsin den Unterordnern des aktuellen Verzeichnisses, die __init__.pyDateien und noch mehr enthalten. Wie lösche ich alle Dateien außer __init__.pyden Unterordnern, die migrationsnach dem aktuellen Ordner benannt sind?

UPD: Und ist es möglich, __init__.pymit 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 findim aktuellen Verzeichnis ( .) ausgeführt und:

  • für alles, was übereinstimmt migrations/__init__.py, wird der truncateBefehl 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__.pyund 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.

verwandte Informationen