Etwas wie das Folgende ist das, wonach ich suche, aber mein Code funktioniert nicht, egal wie ich flüchte {}
und+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Nach diesen sehen Unix - & - Linux Frage fand ich , dass der folgende Code funktioniert, aber es ist nicht Verschachtelung Fund als solche, und ich vermute , dass es einen besseren Weg, diese besondere Arbeit zu tun.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Gibt es eine Möglichkeit zum Verschachteln, find -exec
ohne dass eine Shell (wie oben) mit all ihren verrückten Zitier- und Fluchtbeschränkungen aufgerufen werden muss?
Oder kann dies direkt in einem einzelnen Suchbefehl unter Verwendung einer Mischung seiner vielen Parameter erfolgen?
text-processing
find
filenames
Peter.O
quelle
quelle
find
Wennfind
dies nicht möglich ist, warum wirdfind
es dann als Werkzeug so verehrt (?)? zum Finden von Dateien zu verwenden? ... Ich habe später festgestellt, dass diesfind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
in meiner Situation gut funktioniert (der Verweis auf jw013 hat-prune
mich auf der Manpage dazu geführt), aber ich frage mich, ob es eine robuste Methode ist (in Gattungen). Ich habefind
(in weniger als einem Jahr Linux) noch nie solocate
viel benutzt, wie ich brauchte, also ist es Neuland.-path
Test ist genau das, was ich vorschlagen wollte. Damit solltest du in der Lage sein, alles zu tun , was du willst (Entschuldigung für den Verein Ace Of Base;))Antworten:
Ich würde versuchen, einen einzigen Fund wie:
oder sogar (gar nicht
find
, nur Shell-Globbing)Obwohl dies die
-type f
Prüfung fehlt , funktioniert dies nur, wenn Sie keine Verzeichnisse / Nicht-Dateien haben, die auf enden.ini
. Wenn Sie das tun, könnten Sie verwendenDies würde jedoch den Vorteil verlieren, nur einen md5sum-Aufruf zu benötigen.
Bearbeiten
Für eine allgemeine und sichere Verkettungsmethode
find
können Sie so etwas tunquelle
-f
(f?) Und dann einen weiteren Fehler mit-execdir
.. Wenn ich -execdir durch -exec ersetze und / oder auch md5sum durch print ersetze, erhalte ich nichts ..find
Suche nach einer Möglichkeit, dies zu tun ... Es ist nicht so sehr, dass ich nur dieses Beispiel auflösen möchte, ich suche nach Einsichten in die Wege von find-fu ... Vielleicht ist mehr Flaum als FU in der Entdeckung (ich weiß es nicht, weil ich es so gut wie nie benutzt habe), und dies ist die erste Situation, die ich wirklich wollte (eigentlich für Bilddateien) und die -exec Feature, von dem ich so viel gehört habe, scheint nicht so mächtig zu sein, wie es rep (?) andeutet ... (+1 für die Alternativen) .. aber deinfind
Beispiel funktioniert einfach nicht (immer noch) )find
Befehl: ...find: The relative path
~ / bin 'ist in der Umgebungsvariablen PATH enthalten, die in Kombination mit der Aktion -execdir von find unsicher ist. Bitte entferne diesen Eintrag aus $ PATH` .... Vielleicht wird es also funktionieren, aber ich muss sagen, dass ich schon seit einiger Zeit versuche, das ~ / bin loszuwerden ... Ich muss so viel mehr nehmen ernsthafter Blick darauf ... Ich weiß nicht, wo ich es eingestellt habe ... irgendwelche Ideen, wo es lauern könnte; das~/bin
in meinemfind
wird am besten in Situationen gewürdigt, die nicht vollständig mit Globs erreicht werden können, aber da solche Situationen selten sind, brauche ich normalerweise nicht viel zu finden.Ihr ursprüngliches Problem erfordert keinen rekursiven Aufruf von find, aber ich nehme an, das war nicht der Punkt.
Ich glaube, es ist nicht möglich, find rekursiv so aufzurufen, wie Sie es möchten.
Der folgende Befehl ruft find nicht rekursiv auf (oder verschachtelt, wie auch immer er genannt wird), aber können Sie nicht einfach eine Ergebnismenge der ersten Suche nehmen und an die zweite weiterleiten? So würde ich instinktiv vorgehen:
Sie können es auch
xargs
zum Ausführen des zweiten Suchvorgangs verwenden.Aktualisieren:
Ich wollte hinzufügen, dass, da die meisten UNIX-Dienstprogramme anstelle von einem mehrere Dateinamenargumente verwenden, Sie in der Regel Folgendes vermeiden
-exec
können:Beim Verschachteln von Backticks fügen Sie einfach Backslashes
\
vor den inneren hinzu.Wenn wir uns vorstellen, dass
md5sum
nur ein Dateinamenargument verwendet wird, können wir es immer in einefor
Schleife einschließen:Beachten Sie, dass dies schwieriger wird, wenn Datei- / Verzeichnisnamen
-
betroffen sind, die mit einem Leerzeichen beginnen oder ein Leerzeichen enthalten. UNIX-Dienstprogramme spielen nicht gut mit ihnen. In diesem Fall./
müssen--
Anführungszeichen oder Anführungszeichen hinzugefügt werden .Offensichtlich ist das ursprüngliche Beispiel nicht gut, weil wir einfach tun könnten:
quelle
find
Methoden erhalten eine Fehlermeldung, wenn eine Datei / ein Verzeichnis Leerzeichen enthält ... Dasmd5sum .*/*.ini
funktioniert gut ... Ich bekomme allmählich das allgemeine Gefühl, dass * Warren Youngs * Kommentar über Dinge, die 'komplex' werden,find
geschieht zu Beginn des Spiels :), aber ichfind
gehe davon aus, dass sie sich auszahlen, wenn die Bedingungstests komplizierter sind. wie es scheint, gibt es einfachere Möglichkeiten, um es zu tun .. (aber Perl ist nicht "einfach" für mich (noch) ...Zumindest habe ich es geschafft, 2 find-Befehle zu verschachteln:
Aber ich habe nicht gelöst, um einen anderen -exec (dir) - Anruf von dort aufzurufen.
quelle