Ich muss alle Ordner in einem Ordner mithilfe eines täglichen Skripts löschen. Der Ordner für diesen Tag muss verlassen werden.
Der Ordner 'myfolder' hat 3 Unterordner: 'test1', 'test2' und 'test3'. Ich muss alle bis auf 'test2' löschen.
Ich versuche hier den genauen Namen zu finden:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
ODER
find /home/myfolder -type d ! -name 'test2' -delete
Dieser Befehl versucht immer auch den Hauptordner 'myfolder' zu löschen! Gibt es eine Möglichkeit, dies zu vermeiden?
!
Operator angeben:\!
oder'!'
.Antworten:
Dadurch werden alle Ordner innerhalb löschen ,
./myfolder
außer dass./myfolder/test2
und alle Inhalte bewahrt werden:Wie es funktioniert
find
Startet einen Suchbefehl../myfolder
weist find an, mit dem Verzeichnis./myfolder
und seinem Inhalt zu beginnen.-mindepth 1
nicht, um sich./myfolder
selbst zu entsprechen, nur die Dateien und Verzeichnisse darunter.! -regex '^./myfolder/test2\(/.*\)?'
Weist find an,!
alle Dateien oder Verzeichnisse, die mit dem regulären Ausdruck übereinstimmen , auszuschließen ( )^./myfolder/test2\(/.*\)?
.^
stimmt mit dem Anfang des Pfadnamens überein. Der Ausdruck(/.*\)?
entspricht entweder (a) einem Schrägstrich gefolgt von irgendetwas oder (b) überhaupt nichts.-delete
weist find an, die übereinstimmenden (dh nicht ausgeschlossenen) Dateien zu löschen.Beispiel
Stellen Sie sich eine Verzeichnisstruktur vor, die wie folgt aussieht:
Wir können den Befehl find (ohne
-delete
) ausführen, um zu sehen, was damit übereinstimmt:Wir können überprüfen, ob dies funktioniert hat, indem wir uns die verbleibenden Dateien ansehen:
quelle
-prune
umtest2/*/
Unterverzeichnisse in Ruhe zu lassen: Kehren Sie zurm -r
und fügen Sie hinzu-maxdepth 1
../myfolder
. Sie benötigen ein fehlendes (IMvhO) nur-type d
für Verzeichnisse .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Bash benutzen :
Beispiel:
quelle
tl; dr
Entfernen Sie das Echo, wenn Sie mit der Liste der Dateien zufrieden sind.
Mit
-mindepth 1
wird sichergestellt, dass das oberste Verzeichnis nicht ausgewählt ist.Aber Subdirs im Inneren
-not -name test2
werden nicht vermiedentest2
:Um das zu tun, brauchst du so etwas wie Prune:
Aber nicht verwenden
delete
, wie es impliziertdepth
und das wird vom längsten Weg zu löschen beginnen:Verwenden Sie entweder
rm -rf
(entfernen Sie das,echo
wenn Sie tatsächlich löschen möchten):Oder verwenden Sie auch ,
maxdepth
wenn Sie nur Verzeichnisse (und alles darin)echo
löschen müssen (entfernen Sie das, um es tatsächlich zu löschen):A
-delete
schlägt immer noch fehl, wenn das Verzeichnis nicht leer ist:quelle
Wenn Sie zsh verwenden, können Sie:
quelle
Getestet mit dem folgenden Befehl und es hat gut funktioniert
quelle
-mindepth 1
) bewirkt, dass das oberste Verzeichnis allen Kriterien entspricht (es ist ein Verzeichnis und heißt nicht "test2") und wird daher gelöscht.