Mein oberstes Verzeichnis ist data
. data
enthält mehrere Verzeichnisse und diese Verzeichnisse haben Unterverzeichnisse. Ich muss alle Dateien und Verzeichnisse data/
außer einigen Dateien in einigen Verzeichnissen entfernen .
Zu den Daten gehören beispielsweise die Verzeichnisse 100
und 101
. Ich möchte nur a.txt
und b.txt
Dateien in 100/
und c.txt
und d.txt
Dateien in behalten, 101/
während alle anderen Dateien und Verzeichnisse in 100
und entfernt werden 101
.
Beispiel:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
Ich verwende den rm -rf !(a.txt|b.txt)
Befehl, kann diesen Befehl jedoch nicht automatisch für jedes Verzeichnis anwenden.
quelle
rm
wissen sollten, welche Dateien in welchen Verzeichnissen aufbewahrt werden sollen, wenn Sie dies nicht angeben möchten.Sie könnten dafür verwenden
find
. Sie können Testsfind
mit-not
oder negieren!
. Dadurch werden Übereinstimmungen ausgeschlossen, anstatt sie zu finden.Sie sollten darauf achten, keines der übergeordneten Verzeichnisse der Dateien, die Sie behalten möchten, zu löschen, insbesondere das aktuelle Verzeichnis.
.
Lesen Sie daher die Ausgabe sorgfältig durch, bevor Sie sie löschen.Anhand Ihres Beispiels können Sie so etwas aus dem
data
Verzeichnis heraus tun .Fügen Sie
! -path ./path/to/dir
für jeden Pfad, den Sie löschen möchten, ein hinzu. Sie können Metazeichen wie verwenden*
, aber stellen Sie sicher, dass Sie den Ausdruck zitieren, wenn Sie dies tun, z"./path*dir"
um unerwünschte Erweiterungen zu verhindern.find
ist standardmäßig rekursiv. Auch wenn wir./100
hier nicht finden , werden wir alle Inhalte finden , es sei denn, sie stimmen mit dem Muster überein[ab].txt
. Wenn Sie nicht alle Namen finden können, die Sie behalten möchten, fügen Sie einen weiteren Test hinzu:Dies wird nicht
a.txt
oderb.txt
oder findenfoo
, aber es werden alle anderen Dateien gefunden.Wenn Sie sicher sind, dass Sie sehen, was Sie wollen, können Sie
-delete
am Ende hinzufügen , um die gefundenen Dateien zu löschen:quelle