Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Script bash, gestion des espaces dans les noms de fichiers

5 réponses
Avatar
Cedric Foll
Bonjour,



j'ai un script bash qui fait ceci:
-----
for i in `find rep -type -f`; do
#qq chose avec le fichier $i
done
-----

Cela marche bien tant que je n'ai pas d'espace dans un nom de fichier.
Lorsque cela arrive, je me retrouve avec le nom coupé en 2. $i prend la
première partie puis la seconde.

J'ai essayé de faire un
find rep -type -f -exec echo \'{}\' \;
à la place.
Sauf qu'ensuite bash me fait des \' lorsque je veux traiter $i et donc
on me dit que je fichier n'existe pas.

Quelle est la solution ?

Comment faire qq chose avec tous les fichiers d'un répertoire lorsque
les fichiers peuvent contenir des espaces ?

Merci.

5 réponses

Avatar
Stephane Chazelas
2004-10-13, 12:25(+02), Cedric Foll:
[...]
j'ai un script bash qui fait ceci:
-----
for i in `find rep -type -f`; do
#qq chose avec le fichier $i
done
-----
[...]


find rep -type f -exec bash -c '
i=$1
#qq chose avec le fichier "$i"
' {} {} ;

Ou encore (en supposant que les noms des fichiers ne contiennent
pas de sauts de lignes):

find rep -type f -print | while IFS= read -r i; do
#qq chose avec le fichier "$i"
# attention, stdin est modifié
done


ou encore

set -f
IFS='
'
for i in $(find rep -type f -print); do
#qq chose avec le fichier "$i"
done

--
Stephane

Avatar
Nicolas George
Cedric Foll wrote in message <ckj06m$n4q$:
Quelle est la solution ?


rm -f /bin/bash
exec /bin/zsh

for i in rep/**/*(.); do
...
done

Zsh, c'est bien.

Avatar
Cedric Foll
set -f
IFS='
'
for i in $(find rep -type f -print); do
#qq chose avec le fichier "$i"
done



Merci beaucoup!
Cela fonctionne parfaitement.

Avatar
Stephane Chazelas
2004-10-13, 10:55(+00), Nicolas George:
Cedric Foll wrote in message <ckj06m$n4q$:
Quelle est la solution ?


rm -f /bin/bash
exec /bin/zsh

for i in rep/**/*(.); do
...
done
[...]


C'est pas tout-a-fait equivalent. L'equivalent de

find . -type f -print | ...

serait:

for i in rep/**/*(ND.); do
...
done

--
Stephane


Avatar
andrea ferraris
Stephane Chazelas wrote:

2004-10-13, 12:25(+02), Cedric Foll:
[...]

j'ai un script bash qui fait ceci:
-----
for i in `find rep -type -f`; do
#qq chose avec le fichier $i
done
-----


[...]

find rep -type f -exec bash -c '
i=$1
#qq chose avec le fichier "$i"
' {} {} ;

Ou encore (en supposant que les noms des fichiers ne contiennent
pas de sauts de lignes):

find rep -type f -print | while IFS= read -r i; do
#qq chose avec le fichier "$i"
# attention, stdin est modifié
done


ou encore

set -f
IFS='
'
for i in $(find rep -type f -print); do
#qq chose avec le fichier "$i"
done



Comment seulement trois solutions?? Il y en a pas d'autres? ;-)

Quand il y a une question de shell script il faut voir s'il y a
deja une reponse de Stephane. S'il n'y a pas il faut patienter,
ou s'on est vraiement tres sur de la juste reponse, la donner
apres d'avoir controlle au moins deux ou trois fois sur tous les
documents officiaux disponibles sur le sujet et apres avoir enleve
toutes les affirmation des quelles on n'est pas absolument sur.
Enfin Stephane repondra aussi, et peut etre qu'il ne corrigera
votre reponse, mais surement il donnera une autre reponse meilleure.
C'est la vie, il faut savoir apprendre et il faut aussi avoir
des heros ;-).

Andrea