Définissez IFS sur nouvelle ligne, comme ceci :
IFS='
'
for x in `ls -l $1`; do echo $x; done
Mettez un sous-shell autour si vous ne voulez pas définir IFS de manière permanente :
(IFS='
'
for x in `ls -l $1`; do echo $x; done)
Ou utilisez while | lisez plutôt :
ls -l $1 | while read x; do echo $x; done
Une autre option, qui exécute le while/read au même niveau du shell :
while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
Comme déjà mentionné, awk est le bon outil pour cela. Si vous ne voulez pas utiliser awk, au lieu d'analyser la sortie de "ls -l" ligne par ligne, vous pouvez parcourir tous les fichiers et faire un "ls -l" pour chaque fichier individuel comme ceci :
for x in * ; do echo `ls -ld $x` ; done
Cela dépend de ce que vous voulez faire avec chaque ligne. awk est un utilitaire utile pour ce type de traitement. Exemple :
ls -l | awk '{print $9, $5}'
.. sur mon système imprime le nom et la taille de chaque élément du répertoire.