Wenn ich benutze
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
Es findet alle Dateitypen. Aber wenn ich -exec
am Ende hinzufüge :
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
es scheint, dass es nur .txt
Dateien druckt . Was mache ich falsch?
Hinweis: Verwenden von MINGW (Git Bash)
*.js*
oder übereinstimmen*.txt
.Antworten:
ist kurz für:
Das heißt, da kein Aktionsprädikat angegeben ist (nur Bedingungen ),
-print
wird implizit eine Aktion für die Dateien hinzugefügt, die den Bedingungen entsprechen.(und das würde übrigens nicht reguläre
.js
Dateien drucken (das-type f
gilt nur für.htm
Dateien)).Während:
ist kurz für:
Für
find
(wie in vielen Sprachen) hat AND (-a
implizit, wenn weggelassen) Vorrang vor OR (-o
), und das Hinzufügen eines expliziten Aktionsprädikats (hier-exec
) bricht die-print
oben gezeigte implizite Aktion ab. Hier möchten Sie:Oder:
Um zu vermeiden, dass eine
sh
Datei pro Datei ausgeführt wird.quelle
Es sind die implizierten Klammern. Fügen Sie explizite Klammern hinzu.
\(
\)
oder mit xargs (ich mag xargs ich finde es einfacher, aber anscheinend nicht so portabel).
quelle