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 semble qu'il n'imprime que .txt
des dossiers. Qu'est-ce que je fais de mal ?
Remarque :en utilisant MINGW (Git Bash)
Réponse acceptée :
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
est l'abréviation de :
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
Autrement dit, parce qu'aucune action le prédicat est spécifié (seulement conditions ), un -print
l'action est implicitement ajoutée pour les fichiers qui correspondent aux conditions.
(et, soit dit en passant, cela imprimerait .js
non régulier fichiers (le -type f
ne s'applique qu'à .htm
fichiers)).
Alors que :
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
est l'abréviation de :
find . ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )
Pour find
(comme dans de nombreuses langues), ET (-a
; implicite lorsqu'il est omis) a priorité sur OU (-o
), et en ajoutant un prédicat d'action explicite (ici -exec
) annule le -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'exécuter un sh
par fichier.