GNU/Linux >> Tutoriels Linux >  >> Linux

Comment effectuer une boucle for-each sur tous les fichiers sous un chemin spécifié ?

Le for -loop itérera sur chaque entrée (séparée par des espaces) sur la chaîne fournie.

Vous n'exécutez pas réellement le find commande, mais fournissez-la sous forme de chaîne (qui est itérée par le for -loop). Au lieu des guillemets doubles, utilisez des backticks ou $() :

for line in $(find . -iname '*.txt'); do 
     echo "$line"
     ls -l "$line"
done

De plus, si vos chemins/noms de fichiers contiennent des espaces, cette méthode échoue (puisque le for -loop itère sur les entrées séparées par des espaces). Au lieu de cela, il est préférable d'utiliser la méthode décrite dans la réponse Dogbanes.

Pour clarifier votre erreur :

Comme dit, for line in "find . -iname '*.txt'"; itère sur toutes les entrées séparées par des espaces, qui sont :

  • trouver
  • .
  • -iname
  • '*.txt' (je pense...)

Les deux premiers n'entraînent pas d'erreur (hormis le comportement indésirable), mais le troisième est problématique car il s'exécute :

ls -l -iname

De nombreuses commandes (bash) peuvent combiner des options de caractère unique, donc -iname est identique à -i -n -a -m -e . Et voilà :votre invalid option -- 'e' erreur !


Voici une meilleure façon de boucler sur les fichiers car elle gère les espaces et les retours à la ligne dans les noms de fichiers :

#!/bin/bash

find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
    echo "$line"
    ls -l "$line"    
done

Utilisez la substitution de commande au lieu des guillemets pour exécuter find au lieu de transmettre la commande sous forme de chaîne :

for line in $(find . -iname '*.txt'); do 
     echo $line
     ls -l $line; 
done

Version plus compacte fonctionnant avec des espaces et des retours à la ligne dans le nom du fichier :

find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;

Linux
  1. Comment vérifier les fichiers volumineux dans la console

  2. Comment boucler sur les lignes d'un fichier ?

  3. Comment remplacer un caractère par un autre dans tous les noms de fichiers des répertoires actuels ?

  4. Comment trouver tous les fichiers liés à un logiciel ?

  5. Comment trouver tous les fichiers épars sous Linux

Comment rechercher des fichiers sous Linux avec la commande Find

Comment trouver des fichiers en utilisant la ligne de commande dans le terminal Linux

Comment rechercher des fichiers avec la commande fd sous Linux

Comment effectuer une recherche Grep sur tous les fichiers et dans tous les répertoires

Comment puis-je éditer tous les fichiers renvoyés par find in vi sous Linux ?

Comment lister tous les fichiers d'une partition sous Linux ?