trouver . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
est l'abréviation de:
trouver . \ (\ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -un imprimé
Autrement dit, aucun prédicat d' action n'étant spécifié (uniquement des conditions ), une -print
action est implicitement ajoutée pour les fichiers correspondant aux conditions.
(et, en passant, cela imprimerait des .js
fichiers non réguliers (la -type f
seule s'applique aux .htm
fichiers)).
Tandis que:
trouver . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
est l'abréviation de:
trouver . \ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
Car find
(comme dans de nombreuses langues), AND ( -a
; implicite lorsque omis) a la priorité sur OR ( -o
) et l’ajout d’un prédicat d’action explicite (ici -exec
) annule l’ -print
action implicite vue ci-dessus. Ici, vous voulez:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
Ou:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Pour éviter d'en exécuter un sh
par fichier.
*.js*
ou*.txt
.