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.