erste Option im Linux-Dienstprogramm "find"?

12

Gibt es eine Option für die Breite zuerst / Tiefe zuerst im Linux-Dienstprogramm `find '?

Xiè Jìléi
quelle

Antworten:

5

Es gibt nichts Eingebautes zu finden, auch nicht GNU. Sie können die Ausgabe von findnach der Anzahl der Schrägstriche sortieren, zum Beispiel mit Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> ist die Liste aller Eingabezeilen;
  • $a =~ s!/!/!gist die Anzahl der Schrägstriche $a, die wir als Sortierkriterium verwenden.

Wenn Sie zsh verwenden können:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* listet alle Dateien im aktuellen Verzeichnis und den Unterverzeichnissen auf.
  • Das Zeug in den Klammern ist ein Glob-Qualifier.
  • Das Glob-Qualifikationsmerkmal oesteuert die Reihenfolge, in der Übereinstimmungen zurückgegeben werden: Sie werden nach dem Wert von, REPLYnachdem der Code hier ausgeführt wurde, in Anführungszeichen für jede Übereinstimmung sortiert, wobei REPLYanfangs der übereinstimmende Pfad festgelegt wurde.
  • Der Code wandelt sich $REPLYum, um alles außer Schrägstrichen zu löschen. Das Ergebnis besteht also aus allem in Tiefe 1 (Leerergebnis $REPLY), dann aus allem in Tiefe 2 ( $REPLYendet zu sein /), Tiefe 3 ( //) usw.
Gilles
quelle
1
Das Sortieren nach dem Vorgang ist sehr interessant. Allerdings muss das Sortieren erst abgeschlossen werden, und Sie haben keine Chance, die Unterbrechung zu kontrollieren.
Xiè Jìléi
2

Nee

In dieser Frage zu SO finden Sie Problemumgehungen.

Nifle
quelle
1

Mein Gefühl ist, dass du kannst. Es beinhaltet grep und so und eine Schleife, aber ich finde, es funktioniert sehr gut, speziell für Ihren Fall, dass der Fund nicht abgeschlossen werden muss.

Es ist ressourcenintensiver, weil:

  • Viel Gabeln
  • Viele Funde
  • Jedes Verzeichnis vor der aktuellen Tiefe wird so oft gefunden, wie die Dateistruktur insgesamt tief ist (dies sollte kein Problem sein, wenn Sie praktisch jede Menge RAM haben ...).

Das ist gut, weil:

  • Es verwendet Bash und grundlegende Gnu-Tools
  • Es kann kaputt gehen, wann immer Sie wollen (als ob Sie sehen, wonach Sie gesucht haben)
  • Es funktioniert pro Zeile und nicht pro Suche, sodass nachfolgende Befehle nicht auf eine Suche und eine Sortierung warten müssen
  • Es basiert auf der tatsächlichen Dateisystemtrennung. Wenn Sie also ein Verzeichnis mit einem Schrägstrich haben, wird es nicht tiefer aufgelistet als es ist. Wenn Sie ein anderes Pfadtrennzeichen konfiguriert haben, ist dies weiterhin in Ordnung.
#! / bin / bash 
Tiefe = 0

während find -mindepth $ depth -maxdepth $ depth | grep '.'
machen
    Tiefe = $ ((Tiefe + 1))
getan

Sie können es auch ganz einfach in eine Zeile einpassen:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Aber ich bevorzuge kleine Skripte gegenüber dem Tippen ...

ClashTheBunny
quelle