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 ), -printwird implizit eine Aktion für die Dateien hinzugefügt, die den Bedingungen entsprechen.
(und das würde übrigens nicht reguläre .jsDateien drucken (das -type fgilt nur für .htmDateien)).
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 ( -aimplizit, wenn weggelassen) Vorrang vor OR ( -o), und das Hinzufügen eines expliziten Aktionsprädikats (hier -exec) bricht die -printoben 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 shDatei pro Datei ausgeführt wird.
*.js*oder übereinstimmen*.txt.