finden . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
ist kurz für:
finden . \ (\ ( -Typ f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -Ein Druck
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:
finden . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
ist kurz für:
finden . \ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
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:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
Oder:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Um zu vermeiden, dass eine sh
Datei pro Datei ausgeführt wird.
*.js*
oder übereinstimmen*.txt
.