Wie kann ich dafür sorgen, dass "Suchen" den Ordner ausschließt, in dem gesucht wird?

18

Ich führe den folgenden Befehl aus:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Ich möchte alle Ordner unter dem processingOrdner löschen (der Verarbeitungsordner sollte niemals gelöscht werden).

Der Befehl löscht auch den processingOrdner. Wie beschränke ich das Skript darauf, nur die Ordner unter diesem Ordner zu löschen ?

Elad Dotan
quelle
1
Nachwelt: stackoverflow.com/questions/13525004/…
Trevor Boyd Smith

Antworten:

32

Der einfachste Weg wäre, einfach hinzuzufügen -mindepth 1, wodurch die erste Tiefenhierarchie übersprungen wird und somit Ihr übergeordnetes Verzeichnis weggelassen wird.

Außerdem brauchen Sie keinen zusätzlichen -execAnruf rm, Sie können nur deletedie Ordner direkt, wenn sie leer sind.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Wenn sie nicht leer sind:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Wenn Sie faul sind, können Sie auch einen Platzhalter erweitern lassen. Da *das aktuelle Verzeichnis standardmäßig nicht enthalten dotglobist ( sofern nicht festgelegt ), können Sie auch Folgendes tun:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Dies würde jedoch aufgrund der dotglobOption auch keine versteckten Ordner einschließen .

slhck
quelle
Hallo, ich erhalte "find: warning: Sie haben die Option -mindepth nach einem Nicht-Optionsargumenttyp angegeben, aber die Optionen sind nicht positionell (-mindepth wirkt sich sowohl auf die zuvor angegebenen als auch auf die danach angegebenen Tests aus. Bitte geben Sie Optionen an vor anderen Argumenten. "und auch" find: kann `/ folder / 50d82faf0e09e 'nicht löschen: Verzeichnis nicht leer"
Elad Dotan
Fügen Sie dann mindepth hinzu, bevor Sie eingeben. Um die Verzeichnisse zu löschen, wenn sie nicht leer sind, können Sie sich an den ursprünglichen Ansatz halten.
Slhck
4

Das Problem ist, dass find das aktuelle Verzeichnis (.) Zusammen mit den anderen Verzeichnissen zurückgibt, sodass sowohl der Verarbeitungsordner als auch die Unterverzeichnisse gelöscht werden. Eine schnelle Möglichkeit, dies zu umgehen, besteht darin, die Option anzuhängen

-not -name .

Dies verhindert, dass find das aktuelle Verzeichnis ausgibt, und verhindert, dass es gelöscht wird.

Dies würde funktionieren, wenn Sie den Befehl im Verarbeitungsverzeichnis ausführen würden, um die Tatsache zu berücksichtigen, dass Sie einen absoluten Pfad verwenden:

-not -name /var/www/html/content/processing

Und der ganze Befehl wäre:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Xenopathisch
quelle
Der letzte Befehl ist falsch. -namebezieht sich auf den Basisnamen, es wird nie etwas mit einem Schrägstrich abgeglichen. Sie müssen wahrscheinlich verwenden -path.
Kamil Maciorowski
1

Bereits beantwortet, möchte ich noch einen anderen Ansatz auflisten.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Dies schließt das oberste Verzeichnis (und auch die Unterverzeichnisse) aus, und jetzt können Sie jeden Befehl anwenden, den wir darauf anwenden möchten.

>> Optionen:
-mindepth 1: So schließen Sie das Stammverzeichnis aus
-maxdepth 1: So vermeiden Sie das Parsen von Unterverzeichnissen. (Für ein bestimmtes fragliches Szenario benötigen Sie dies nicht.)
-Typ d: Nur Verzeichnis-Typen auflisten. Diese Option sollte nach Verwendung von mindepth maxdepth verwendet werden.

prashant
quelle
Warum -maxdepth 1? Warum -type dzweimal? Wie unterscheidet sich das von der akzeptierten Antwort?
Attie
@Attie: Danke, den Fehler korrigiert. maxdepth ist nicht erforderlich, aber es wäre nützlich, wenn Sie das Auflisten von Unterverzeichnissen vermeiden möchten.
Prashant