Die -depth
primäre find
Ursache bewirkt, dass eine Tiefensuche durchgeführt wird.
Die Standardsequenz ist jedoch keine Breitensuche.
Die Standardsequenz könnte informell als "Tiefen-Erste-Durchquerung, die Knoten behandelt, wenn sie zum ersten Mal angetroffen werden, anstatt dies während des Zurückverfolgens zu tun" beschrieben werden.
Ich habe ein tatsächliches Bedürfnis nach einer breiten ersten Suche. Wie kann ich mich so find
verhalten?
Zur Veranschaulichung mit folgendem Setup:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find
hat das folgende Standardverhalten:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
und mit -depth
führt es wie folgt aus:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Was ich jedoch möchte, ist die folgende (fiktive) Option:
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
Mit anderen Worten, ich muss alle Dateien / Verzeichnisse in einer bestimmten Tiefe find
verarbeiten / melden, bevor ich fortfahre.
Wie kann ich das machen?
find
(zumindest nicht nur mitfind
). Möchten Sie nur die Dateien auflisten oder andere Primärdaten verwenden?-bfs
das nicht ganz das ist, was ich brauche ... Ich habe ein einfaches Skript, das einen Index für ein großes GitLab-Projekt generiert, das für die Aufnahme in das GitLab-Wiki geeignet ist. Die Header werden hierarchisch basierend auf Verzeichnisnamen erstellt. Es funktioniert hervorragend, außer dass es in der obigen Beispieldateistrukturdelta
unter demcharlie
Unterheader und nicht unter dem übergeordnetenalpha
Header abgelegt wird .find
Ausgabe ist alphabetisch sortiert. Keine Ahnung warum ....-bfs
könnte nützlich sein, auch wenn es nicht perfekt diesen Anwendungsfall passt.Antworten:
Sie können dies nur mit Shell-Platzhaltern tun. Erstellen Sie ein Muster mit zunehmend mehr Verzeichnisebenen.
Hier fehlen Punktedateien. Verwenden Sie
FIGNORE='.?(.)'
in ksh,shopt -s dotglob
in bash odersetopt glob_dots
in zsh, um sie einzuschließen.Vorsichtsmaßnahmen:
Wenn Sie die Reihenfolge oder Verzeichnisse und Nichtverzeichnisse auswählen möchten und die Leistung nicht kritisch ist, können Sie zwei Durchgänge durchführen und
[ -d "$file" ]
bei jedem Durchgang testen .quelle
*
. :)nullglob
und(($#))
als Schleifenbedingung, um diesen Randfall zu vermeiden.# cat ./bfind
Dies funktioniert durch Erhöhen der Tiefe
find
und Wiederholen. Ich denke, es kann Ergebnisse wiederholen, könnte aber leicht gefiltert werdenquelle
Sie können Ihre
find
in eine Sortierung umleiten, die hauptsächlich nach der Anzahl der/
Zeichen im Pfadnamen sortiert ist . Beispielsweise,Hiermit wird
awk
dem Pfadnamen die Anzahl der Schrägstrichesed
vorangestellt und dieses Präfix am Ende entfernt.Da Sie wahrscheinlich möchten, dass der Inhalt des Verzeichnisses
alpha/charlie+
danach aufgelistet wirdalpha/charlie
, müssen Sie bissort -t/ -k1,1 -k2,2 -k3,3 -k4,4
zur gewünschten Tiefe sagen .quelle
Eine andere Antwort, die nicht auf 'find', sondern auf bash basiert - verwenden Sie zuerst die "Länge des übergeordneten Verzeichnisses" und sortieren Sie dann nach Alpha.
Die Antwort stimmt nicht ganz überein, da Ihre Ergebnisse "charlie, bravo, delta" haben, aber ich habe mich gefragt, ob es "bravo, charlie, delta" in Alpha-Reihenfolge sein sollte.
Das produziert
quelle