Votre code ne fonctionne pas sous OS X ou Linux.
for file in $(find . -name "*.txt")
do
ls -l "${file}"
done
L'interpréteur de commandes effectue d'abord l'expansion de la substitution de la commande $(find . -name "*.txt")
Les résultats sont les suivants file with spaces\nanother file with spaces
et ainsi de suite. Maintenant, l'interpréteur de commandes effectue word spitting
sur la base de la valeur de IFS
- le séparateur de champ interne. La valeur est généralement l'espace blanc, la tabulation et la nouvelle ligne.
Exécutez le code suivant :
for file in $(find . -name "*.txt")
do
echo "${file}"
done
Modifions maintenant le IFS
au seul caractère de retour à la ligne.
IFS='
'
for file in $(find . -name "*.txt")
do
ls -l -- "${file}"
done
Votre code fonctionnera, mais je vous conseille de ne pas modifier les éléments suivants IFS
et trouver des solutions alternatives.
GNU find et BSD find sont tous deux très robustes et peuvent traiter les noms de fichiers comportant des espaces. Vous pouvez éviter la boucle et obtenir des résultats similaires avec une seule ligne
find . -name "*.txt" -ls