Angenommen, ich habe einen Verzeichnisbaum wie diesen:
ROOTDIR
└--SUBDIR1
└----SUBDIR2
└----SUBDIR3
Ich suche nach einem solchen Befehl, dass bei der Eingabe:
$ [unknown command] ROOTDIR
Der gesamte Verzeichnisbaum kann gelöscht werden, wenn keine Datei vorhanden ist, sondern nur Verzeichnisse innerhalb des gesamten Verzeichnisbaums . Sagen Sie jedoch, ob es unter SUBDIR1 eine Datei namens hello.pdf gibt:
ROOTDIR
└--SUBDIR1
└--hello.pdf
└----SUBDIR2
└----SUBDIR3
Dann darf der Befehl nur SUBDIR2 und darunter löschen.
Antworten:
Alexis ist in der Nähe. Was Sie tun müssen, ist Folgendes:
Dadurch wird zuerst der Verzeichnisbaum durchsucht, bis das erste leere Verzeichnis gefunden und dann gelöscht wird. Dadurch wird das übergeordnete Verzeichnis leer, das dann gelöscht wird, usw. Dies erzeugt den gewünschten Effekt (ich mache dies wahrscheinlich 10 Mal pro Woche, also bin ich mir ziemlich sicher, dass es richtig ist). :-)
quelle
-depth
Option notwendig?find . -type d -empty -exec rmdir "{}" \;
sollte auch funktionieren .... oder?foo/bar/baz
. Wenn Sie dies nicht verwenden-depth
, wird zuerst versucht, zu löschen. Wenn diesfoo
fehlschlägt, wird das Programmfoo/bar
ausgeführt.+
statt ,;
so dass Sie Batch entfernen Verzeichnisse. Da Sie dies zuerst tun, werden die Kinder vor den Eltern entfernt (möglicherweise abhängig von Ihrer Version von rmdir / bash und abhängig davon, dass rmdir keine nicht leeren Verzeichnisse löscht). Dies funktioniert für mich in Bash auf Cygwin:mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
gleich wie
benutzt aber die eingebaute "-delete" Aktion.
Beachten Sie, dass "-delete" "-depth" impliziert.
quelle
Ich würde Folgendes versuchen:
quelle
Hier sind einige Voraussetzungen, bevor wir es sicher machen können:
So würde ich das in der Shell machen:
Wenn Sie nichts gegen überflüssige Fehler haben, können Sie das Entfernen aller Verzeichnisse mit übergeordneten Elementen erzwingen und müssen keine Sortierung vornehmen (Sie können keine mit NUL abgeschlossenen Zeichenfolgen sortieren, die tr hinzufügen müssen).
quelle
-empty -delete
Optionen fürfind
die Antwort von @ go2null kennengelernt habe.quelle
find
dafind
hat eine Art , die Verarbeitung sauber zu tun:find … -exec
.Ich würde das machen:
quelle