GNU/Linux >> Tutoriels Linux >  >> Linux

`find` avec plusieurs `-name` et `-exec` n'exécute que les dernières correspondances de `-name` ?

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.


Linux
  1. Obtenir des informations avec la commande vsish (esxi uniquement)

  2. Mon chargeur de démarrage ne peut pas être compilé avec gcc 4.6 et 4.7 ... seulement 4.5

  3. Comment trouver le dernier champ en utilisant 'cut'

  4. Quel est le problème avec mon script bash pour conserver les x derniers fichiers et supprimer le reste ?

  5. créer tar avec plusieurs répertoires et emplacements de fichiers

Regardez les commandes et les tâches avec la commande Linux watch

Rechercher des fichiers et des répertoires sous Linux avec la commande find

Importer des fonctions et des variables dans Bash avec la commande source

Les commandes alias et unalias expliquées avec des exemples

Comment exécuter Grep avec plusieurs et modèles ?

Comment afficher la sortie Tail -f avec des couleurs en utilisant uniquement Awk et afficher le reste de la sortie?