Optimierte Lösungen für GNU find
†
Zumindest für einige System+Dateisystem-Kombinationen muss find
nicht stat
auf eine Datei anwenden, um deren Typ zu ermitteln. Dann können Sie überprüfen, ob es sich um ein Verzeichnis handelt, bevor Sie die Lesbarkeit testen, um die Suche zu beschleunigen‡ - Ich habe bei Tests, die ich durchgeführt habe, etwa 30% Verbesserung erzielt. Daher sollten Sie bei langen Suchen oder Suchen, die häufig genug ausgeführt werden, eine dieser Methoden verwenden:
Alles Sichtbare ausgeben
$ find . -print -type d ! -readable -prune
$ find . -type d ! -readable -prune , [expression] -print
Sichtbare Dateien ausgeben
$ find . -type d \( ! -readable -prune -o -true \) -o [expression] -print
Nur sichtbare Verzeichnisse ausgeben
$ find . -type d -print ! -readable -prune
$ find . -type d \( ! -readable -prune , [expression] -print \)
Nur lesbare Verzeichnisse ausgeben
$ find . -type d ! -readable -prune -o [expression] -print
Notizen
† Die Operatoren -readable
und ,
(Komma) sind GNU-Erweiterungen. Dieser Ausdruck
$ find . [expression] , [expression]
ist logisch äquivalent zu
$ find . \( [expression] -o -true \) [expression]
‡ Dies liegt daran, dass find
-Implementierungen mit dieser aktivierten Optimierung im besprochenen Anwendungsfall das stat
en von Nicht-Verzeichnisdateien vollständig vermeiden werden.
Bearbeitung: Shell-Funktion
Hier ist eine POSIX-Shell-Funktion, die ich entwickelt habe, um diesen Test jeder Ausdruck voranzustellen. Es scheint gut zu funktionieren mit dem impliziten -print
und den Kommandozeilenoptionen:
findr () {
j=$#; done=
while [ $j -gt 0 ]; do
j=$(($j - 1))
arg="$1"; shift
test "$done" || case "$arg" in
-[A-Z]*) ;; # Optionen überspringen
-*|\(|!) # Anfang des Ausdrucks finden
set -- "$@" \( -type d ! -readable -prune -o -true \)
done=true
;;
esac
set -- "$@" "$arg"
done
find "$@"
}
Die anderen beiden in den Antworten aufgeführten Alternativen verursachten entweder einen Syntaxfehler in der POSIX-Shell (konnte nicht einmal eine Datei mit der Funktionsdefinition einbinden) oder eine falsche Ausgabe in ZSH ... Die Laufzeit scheint gleichwertig zu sein.
0 Stimmen
Tolle Frage! Leider funktionieren die ersten drei Antworten einfach nicht unter Debian Linux. Oder zumindest meine Konfiguration davon. Ich brauchte Fatih's Lösung,
find /. -name 'toBeSearched.file' 2>/dev/null
.0 Stimmen
Ich fand es am besten, den
/proc
-Pfad mithilfe der-path
-Option auszuschließen. Es hilft, die-prune
-Option zu verneinen, um das Drucken von ausgeblendeten Elementen zu vermeiden.