
Die Lösung für dieses Problem ist mir seit Wochen ein Rätsel. Ich versuche, einen Befehl zu schreiben, der nur allgemein beschreibbare Dateien in einer bestimmten Gruppe von Verzeichnissen findet, ohne in irgendwelche Unterverzeichnisse zu wechseln -prune
.
Ich habe eine Vielzahl verschiedener Optionen ausprobiert, aber am Ende blieb nur
find / -type f -perm -2
Dies führt jedoch immer noch zu Durchbrüchen in den Unterverzeichnissen. Mit dem Befehl
find / -prune -type f -perm -2
bringt auch keine Ergebnisse. Was mache ich hier falsch?
Antwort1
Versuchen Sie stattdessen Folgendes maxdepth N
:
-Maximale Tiefenebenen
Steigen Sie maximal um die Ebenen (eine nicht negative Ganzzahl) der Verzeichnisse unterhalb der Startpunkte ab. -maxdepth 0 bedeutet, dass die Tests und Aktionen nur auf die Startpunkte selbst angewendet werden.
find $FOLDER -maxdepth 1 -perm -2
Antwort2
find / -type f -perm -2
Das ist rekursiv. Das ist es, was find
bewirkt.
find / -prune -type f -perm -2
Hier weisen Sie an, auf alles find
anzuwenden, -prune
was es findet. Die Bedingungen und Aktionen werden von links nach rechts verarbeitet. Da vor keine Bedingung steht -prune
, wird es bedingungslos angewendet. Das erste find
gefundene Objekt, nämlich das Befehlszeilenargument /
, wird also -prune
darauf angewendet und find
durchläuft daher nicht den Inhalt des Verzeichnisses. Da /
die folgenden Bedingungen nicht erfüllt sind, wird es nicht gedruckt.
Um nur die Einträge des Toplevel-Verzeichnisses zu verarbeiten, müssen Sie sich -prune
an die Verzeichnisse wendenaußer den Kommandozeilenargumenten. Die portable Möglichkeit hierfür besteht darin, /.
am Ende des in der Befehlszeile übergebenen Pfads zu verwenden. Dies führt dazu, find
dass ihr Name als behandelt wird .
, sodass Sie sie mit vergleichen können -name .
. Bei einer rekursiven Durchquerung wird nie eine Datei aufgerufen, .
da dieser Name reserviert ist. Nun gibt es drei verschiedene Fälle:
- Oberstes Verzeichnis: rekursiv.
- Anderes Verzeichnis: nicht rekursiv.
- Normale Datei, die für alle beschreibbar ist: Drucken.
Um mehrere unterschiedliche Verhaltensweisen anzugeben, verwenden Sie den -o
Operator („oder“). Es gilt das erste Verhalten, bei dem alle Bedingungen zutreffen.
find /. -name . -o -type d -prune -o -type f -perm -2 -print
Einige Versionen find
ermöglichen Ihnen das Schreiben find / -name / -o -type d -prune -o …
, andere nicht (z. B. BusyBox).
Einige Versionen von find
unterstützen Optionen -mindepth
und -maxdepth
zur Einschränkung der rekursiven Durchquerung. Wenn Ihr Find dies unterstützt, können Sie dies anstelle von verwenden -prune
.
find / -mindepth 1 -maxdepth 1 -type f -perm -2
( -mindepth
und -maxdepth
sind globale Optionen, der Teil mit den Bedingungen und Aktionen ist -type f -perm -2
mit dem impliziten nachstehenden -print
.)