Wenn ich benutze
find /home/user/parentdir -type d -empty -delete
es sucht rekursiv nach leeren Unterordnern /home/user/parentdir
und löscht sie. Wenn /home/user/parentdir
aber auch leer ist, löscht es auch den parentdir
Ordner, was für mich unerwünscht ist.
Ich möchte dies parentdir
auf rsync
einige Dateien sichern oder Cloud. Nach der Verarbeitung muss ich die leeren Ordner löschen, aber es scheint unproduktiv, sie parentdir
jedes Mal neu zu erstellen .
Irgendwelche Vorschläge zu behalten parentdir
? Ich habe darüber nachgedacht, eine .nocopy
Datei darin zu erstellen und diese auszuschließen rsync
, aber es sieht aus wie ein Overkill. Gibt es einen eleganteren Weg?
command-line
bash
rsync
find
TNT
quelle
quelle
-mindepth 1
?Antworten:
Einfach machen
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Aussehen:
Die
find /home/user/parentdir/*
Antwort von in AmourK ist unerwünscht, wenn viele Dateien vorhanden und zu kompliziert sind.quelle
Indem Sie
/*
am Ende von hinzufügenparentdir
, führen Sie die Aktion für alle Unterverzeichnisse von parentdir und nicht für sichparentdir
selbst aus. Und so auf die gleiche Weise/home/user/
nicht im alten Befehl gelöschtparentdir
wird , wird nicht im folgenden Befehl gelöscht.*
wird als Glob-Operator bezeichnet und entspricht einer beliebigen Zeichenfolge.find /home/user/parentdir/* -type d -empty -delete
quelle
/home/user/parentdir/
möglicherweise überschritten wirdARG_MAX
, was zu einem zu langen Fehler in der Argumentliste führt. Sie können das Risiko verringern, indem Sie den Glob*/
so ändern, dass er nur mit Verzeichnissen übereinstimmt./tmp
, ein Unterverzeichnis zu erstellen, dort einen komprimierten Tarball zu entpacken, das Installationsprogramm auszuführen und aufzuräumen. Der Neuling dachte, dasrm -rf /tmp/foo-install
sei der richtige Weg, und wie die erfahrene Hand in seinem besten Darth-Vader-am-Ende-der-Episode-III-Eindruck "Noooooo" sagte, fand der Neuling auf die harte Tour heraus, wie nahe das ist / und Enter-Tasten waren zueinander. Wir mussten von der Wiederherstellungsdiskette der Sicherungssoftware booten und den gesamten Server von Band neu laden.wenn du php-cli installiert hast,
quelle
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
oder etwas in der Nähe.$skipped
kümmert sich um das Überspringen des ersten Verzeichnisses,@rmdir
versucht, ein Verzeichnis zu entfernen, und schlägt stumm (das ist das @) fehl, wenn es nicht leer ist.Wenn Sie nur eine Ebene benötigen (einen übergeordneten Ordner verlassen, aber leere untergeordnete Ordner löschen), können Sie dies ganz einfach tun
rmdir
.Löscht alle leeren Unterordner, druckt jedoch nur einen Fehler für Dateien und nicht leere Ordner.
Dies funktioniert nicht rekursiv, aber wenn Sie Ihre Ordnerstruktur kennen, ist dies möglicherweise der schnellste Weg, um so etwas zu tun
Vorteil: Einfach zu merken, schnell zu tippen, wenig Potenzial für die Wahl eines falschen Parameters.
Nachteil: Weniger flexibel, möglicherweise viele Fehlermeldungen in Ihrem Terminal.
quelle