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 "{}"' \;