Su código no funciona en OS X o Linux.
for file in $(find . -name "*.txt")
do
ls -l "${file}"
done
Primero, el shell realiza la expansión del comando de sustitución $(find . -name "*.txt")
Los resultados se parecen a los siguientes:
file with spaces\nanother file with spaces
y así sucesivamente. Ahora, el shell realiza word spitting
basado en el valor de IFS
- el separador de campo interno. El valor suele ser espacio en blanco, tabulador y nueva línea.
Ejecuta el siguiente código:
for file in $(find . -name "*.txt")
do
echo "${file}"
done
Ahora cambiemos el IFS
a solo el carácter de nueva línea.
IFS='
'
for file in $(find . -name "*.txt")
do
ls -l -- "${file}"
done
Su código funcionará, aunque le aconsejo que no cambie IFS
y encuentre soluciones alternativas.
Tanto GNU find como BSD find son muy robustos y pueden manejar nombres de archivos con espacios. Puede evitar el bucle y obtener resultados similares con una línea
find . -name "*.txt" -ls