Il tuo codice non funziona su OS X o Linux.
for file in $(find . -name "*.txt")
do
ls -l "${file}"
done
Prima la shell esegue l'espansione della sostituzione di comando $(find . -name "*.txt")
I risultati sono simili ai seguenti:
file with spaces\nanother file with spaces
e così via. Ora, la shell esegue word spitting
in base al valore di IFS
- il separatore di campo interno. Il valore è in genere spazio bianco, tab e newline.
Esegui il seguente codice:
for file in $(find . -name "*.txt")
do
echo "${file}"
done
Ora modifichiamo IFS
solo per il carattere di nuova riga.
IFS='
'
for file in $(find . -name "*.txt")
do
ls -l -- "${file}"
done
Il tuo codice funzionerà anche se ti consiglio di non cambiare IFS
e trovare soluzioni alternative.
Sia GNU find che BSD find sono molto robusti e possono gestire nomi di file con spazi. Puoi evitare il loop e ottenere risultati simili con una riga
find . -name "*.txt" -ls