Angenommen, ich habe ein Verzeichnis mit dem Namen foo/
. Dieser Ordner enthält Unterverzeichnisse. Wie kann ich alle leeren Verzeichnisse in einem Befehl löschen?
Angenommen, ich habe ein Verzeichnis mit dem Namen foo/
. Dieser Ordner enthält Unterverzeichnisse. Wie kann ich alle leeren Verzeichnisse in einem Befehl löschen?
Antworten:
Versuchen Sie diesen Befehl:
find . -empty -type d -delete
Der find
Befehl wird verwendet, um nach Dateien / Verzeichnissen zu suchen, die mit einem bestimmten Suchkriterium aus dem angegebenen Pfad übereinstimmen, in diesem Fall dem aktuellen Verzeichnis (daher das .
).
Die -empty
Option gilt für alle Dateien und Verzeichnisse, die leer sind.
Die -type d
Option gilt für den angegebenen Dateityp . in diesem Fall d
steht für den Typ Dateiverzeichnis .
Die -delete
Option ist die auszuführende Aktion und gilt für alle in der Suche gefundenen Dateien.
rm -rf <directory-name>
. Dadurch werden das Verzeichnis sowie der gesamte Inhalt einschließlich der Dateien und Unterverzeichnisse entfernt. Die -r
Option bedeutet, dass rekursiv gelöscht wird, während der -f
Befehl bedeutet, dass vor dem Löschen keine Eingabeaufforderung angezeigt wird. Wenn Sie jedoch vor dem Löschen eines Verzeichnisses / einer Datei dazu aufgefordert werden möchten, ersetzen Sie die -f
Option durch die -i
Option.
stdout
Befehl (z. B. find
) in den stdin
anderen (z. B. rm
) eingegeben wird. Seien Sie jedoch sehr vorsichtig, da er möglicherweise Dateien / Verzeichnisse löscht, die Sie nicht möchten löschen! Weitere Informationen dazu finden Sie auf den man
Seiten der einzelnen Befehle. Um sicherzugehen, testen Sie solche Dinge immer in einem temporären Verzeichnis, bevor Sie die reale Sache ausprobieren.
Sie können die rmdir
Weigerung des Befehls, nicht leere Verzeichnisse zu löschen, und die find -depth
Möglichkeit nutzen, die Verzeichnisstruktur von unten nach oben zu durchlaufen:
find . -depth -exec rmdir {} \;
(und ignorieren Sie die Fehler) oder fügen Sie 2>/dev/null
an, um sie wirklich zu ignorieren.
Die -depth
Option zum find
Starten der Suche am unteren Rand des Verzeichnisbaums.
rm -rf
löscht alle Dateien im Verzeichnis (und seinen Unterverzeichnissen und ....) UND alle Verzeichnisse und alles.
rmdir *
Löscht alle leeren Verzeichnisse. Es wird ein Fehler für jedes nicht leere Verzeichnis und jede nicht leere Datei ausgegeben, um zu verhindern, dass diese Fehler Ihr Terminal überladen
rmdir * 2> /dev/null
rmdir * 2>/dev/null || true
. (Der find (1) Weg ist besser für Skripte, aber aus einem anderen Grund: weil er besser ausdrückt, was Sie tun möchten.)
$HOME
. Mit einem bösen Grinsen.
find . -type d -empty -delete -maxdepth 1
Für den Fall, dass Sie nur die direkten Unterverzeichnisse von löschen möchten foo/
.
$ tree
.
├── empty_dir1
├── empty_dir2
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
Das funktioniert so:
os.walk()
Funktion, um den Verzeichnisbaum rekursiv zu durchlaufen. Bei jeder Iteration r
wird auf den aktuellen Ordner gesetzt, auf den wir zugreifen, und s
enthält eine Liste der darin enthaltenen Verzeichnisse r
sowie f
eine Liste der Dateien in diesem Ordner. Wenn f
und s
sind natürlich leer, wissen wir, dass r
das leer ist.empty
, die Liste aller Verzeichnisse, die leer sind, auf der Basis der oben genannten Auswertung zu erstellen .map()
wird os.rmdir()
für jedes Element in der empty
Liste verwendet. Das Listenverständnis könnte ebenso wie eine Alternative verwendet werden.Als Skript wäre dies wie folgt:
#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
if not f and not s and r != ".":
empty.append(r)
for i in empty:
os.rmdir(i)
/bin/sh
und Python ist eine elegantere Sprache als diese beiden