Wenn die Dateistruktur wie folgt ist:
/a/p/c/d...
/c/a/c/g/f/...
/a/c/d/e/...
...
Und ich möchte das tun:
find -mindepth 3 -type d -name p -prune -or -name c -print
Dieser Befehl bereinigt jedoch nicht das Verzeichnis 'p' und die erste Zeile wird eingeschlossen. Ich weiß, dass es eigentlich kein Konflikt ist. Aber wie kann man 'p' mit der angewendeten Mindepth beschneiden?
d
unde
sind Dateien, keine Verzeichnisse?Antworten:
Ich denke, ich würde es so machen:
Basierend auf dem Feedback von @StephaneChazelas glaube ich, dass diese Methode die überflüssige Suche in
/p/
Verzeichnissen eliminieren würde :Einen Fund analysieren
Um Suchbefehle zu vergleichen, können Sie den Debug-Schalter hinzufügen,
-D search
damit Sie sehen können, wie sich ein bestimmter Suchvorgang im Vergleich zu einem anderen verhält.Ich habe @StephaneChazelas 'Befehl gegen meinen ausgeführt, um zu sehen, wo die Unterschiede waren. Die 2 Befehle werden ausgeführt und ihre Ausgabe wird wie folgt ausgeführt
sdiff
:Wenn Sie bemerken, gibt es eine Lücke in Stephanes Ansatz, die meine nicht hat. Auch mit der Pflaume. Ich denke, dies zeigt, dass seine Methode zusätzliche Arbeit beim Betreten von Verzeichnissen vermeidet, die sie sonst ignorieren sollte.
quelle
find
zu einem Abstieg in diep
Verzeichnisse.-prune
dies in dieser Situation nicht möglich ist, ist das Filtern möglicherweise die einzige verbleibende Option.find -mindepth 3 -type d -path '*/p/*' -prune -o -name c -print
.Mit FreeBSD und GNU
find
(einige der wenigen unterstützten Implementierungen-mindepth
)-prune
würden Sie nur diep
Verzeichnisse bereinigen, die sich in Tiefe 3 oder tiefer befinden. Sowohl die FreeBSD- als auch die GNU-find
Dokumentation machen dies deutlich (hier GNU-Dokumentation):Sie können es stattdessen immer auf die übliche Weise tun:
(
-mindepth
und-or
sind keine Standardprädikatefind
, das Weglassen der Verzeichnisse ist auch nicht Standard).Oder mit
zsh
:quelle
-o
statt-or
?-or
mit der-o
POSIX-Konformität identisch ist , diese jedoch nicht.Laut der Manpage von find:
In Ihrem speziellen Fall würde ich also Folgendes tun:
Aber natürlich gibt es nicht immer eine so einfache Lösung.
quelle