Quand j'utilise
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
il trouve tous les types de fichiers. Mais quand j'ajoute -exec
à la fin:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
il semblerait que seuls les .txt
fichiers soient imprimés . Qu'est-ce que je fais mal?
Remarque: en utilisant MINGW (Git Bash)
*.js*
ou*.txt
.Réponses:
est l'abréviation de:
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:
est l'abréviation de:
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:Ou:
Pour éviter d'en exécuter un
sh
par fichier.la source
Ce sont les parenthèses implicites. Ajoutez des crochets explicites.
\(
\)
ou en utilisant xargs (j'aime bien xargs je le trouve plus facile, mais apparemment pas aussi portable).
la source