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

for et les noms avec des espaces blancs....

29 réponses
Avatar
Dominique MICOLLET
Bonjour

Soit un répertoire contenant un paquet de fichiers dont les noms contiennent
des espaces.
Je souhaire faire une opération répétitive sur ces fichiers, en bash (1).
Lorsque je fais la commande à la main et que j'utilise la completion
automatique, bash échappe automatiquement les blancs en les préfixant par
\.
___$ mv aa-> aa->.ccc
est automatiquement traduit en :
___$ mv aaaa\ bbb aaaa\ bbb.ccc
et le fichier 'aaaa bbb' est bien renommé 'aaaa bbb.ccc'
J'essaie d'automatiser la chose pour tous les fichiers avec :
___$ for nom in *; do mv ${nom} ${nom}.ccc ; done
qui ne fonctionne pas parce que les blancs ne sont pas échappés.
J'ai essayé d'insérer des \" et des \' en des endroits stratégiques, sans
succès.

Quelqu'un aurait-il une suggestion à me faire ?

Cordialement.

(1) : pour être précis, il s'agit d'un ensemble de photographies dont je
dois faire un montage pour réaliser un trombinoscope.

--
Dominique MICOLLET
Adresse email : enlever deux francs

10 réponses

1 2 3
Avatar
Gilles
Ref: <4cad9007$0$21886$ de Dominique MICOLLET
Soit un répertoire contenant un paquet de fichiers dont les noms contiennent
des espaces.
Je souhaire faire une opération répétitive sur ces fichiers, en bash (1).
Lorsque je fais la commande à la main et que j'utilise la completion
automatique, bash échappe automatiquement les blancs en les préfixant par
.
___$ mv aa-> aa->.ccc
est automatiquement traduit en :
___$ mv aaaa bbb aaaa bbb.ccc
et le fichier 'aaaa bbb' est bien renommé 'aaaa bbb.ccc'
J'essaie d'automatiser la chose pour tous les fichiers avec :
___$ for nom in *; do mv ${nom} ${nom}.ccc ; done
qui ne fonctionne pas parce que les blancs ne sont pas échappés.
J'ai essayé d'insérer des " et des ' en des endroits stratégiques, sans
succès.

Quelqu'un aurait-il une suggestion à me faire ?



Je ne comprend pas bien la nécessité de toutes les solution "exotiques"
présentées par ailleurs.

Je viens de tester (avec un bash 4.1.5) et il n'y a rien a faire de spécial
excepté mettre des '"' autour des ${nom} et ${nom}.ccc, ce qui donne:

for nom in *; do mv "${nom}" "${nom}.cc" ; done

Démonstration:
:~/tmp$ touch "a b" "c d"
:~/tmp$ ls -1
a b
c d
:~/tmp$ for i in * ; do mv -v "$i" "$i.cc" ; done
`a b' -> `a b.cc'
`c d' -> `c d.cc'
:~/tmp$ ls -1
a b.cc
c d.cc

et d'ailleurs:
:~/tmp$ set *
:~/tmp$ echo $#
2
^-- et pas 4!

alors que, par contre et bien entendu:
:~/tmp$ ls | wc -w
4


NB: tout ceci marche aussi avec ksh de façon identique

(à moins que je n'ai pas bien compris la question? :-/ )
--
Gilles
Avatar
Gilles
Ref: <i8leg0$2e41$ de Cyrille Lefevre
set -- *
for i; do echo mv "$i" "$i.ccc"; done



pas besoin du "set":

for i in * ; do echo mv "$i" "$i.ccc"; done

marche très bien
--
Gilles
Avatar
Gilles
Ref: de Gilles

for i in * ; do echo mv "$i" "$i.ccc"; done




... après avoir supprimé le "echo" bien entendu
--
Gilles
Avatar
Cyrille Lefevre
Le 08/10/2010 08:40, Dominique MICOLLET a écrit :
Hugolino wrote:

$'n', c'est 'new line' : ton script fonctionnera donc s'il n'est pas
inclu dans un nom de fichier...


En tant que vieux dinosaure barbu programmant depuis une éternité e n C,
j'avais reconnu le 'new line'. C'est le $ que je ne comprends pas (je n 'ai
non plus lu le fameux manuel).

De plus, j'ai un peu de mal à comprendre le fonctionnement d'IFS. Tel qu'il
est forcé ici, l'espace n'est plus un séparateur : comment bash sé pare-t'il
ses arguments ?
Visiblement, il y arrive mais il y a une subtilité qui m'échappe.




Bonjour,

c'est une nouveauté des nouveaux shell, cela équivaut à $(echo 'n' )
autrement dit, la commande n'a pas in transformer le n, c'est le shell
qui le fait.

ex. :

sous bash...

$ echo -E ':t:'
:t:
^^ pas tab :-(
vs

$ echo -E $':t:'
: :
^^^^^^^ tab :-)


Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Cyrille Lefevre
Le 08/10/2010 21:48, Gilles a écrit :
Ref: <i8leg0$2e41$ de Cyrille Lefevre
set -- *
for i; do echo mv "$i" "$i.ccc"; done



pas besoin du "set":



effectivement, la force de l'habitude :-)

dés fois, on fait des choses par expérience alors
que c'est tout à fait inutile !

for i in * ; do echo mv "$i" "$i.ccc"; done

marche très bien



Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Rikishi42
On 2010-10-07, Dominique MICOLLET wrote:
Bonjour

Soit un r
Avatar
Rikishi42
On 2010-10-08, Dominique MICOLLET wrote:
Hugolino wrote:

$'n', c'est 'new line' : ton script fonctionnera donc s'il n'est pas
inclu dans un nom de fichier...


En tant que vieux dinosaure barbu programmant depuis une
Avatar
Stephane CHAZELAS
2010-10-08, 21:48(+02), Gilles:
Ref: <i8leg0$2e41$ de Cyrille Lefevre
set -- *
for i; do echo mv "$i" "$i.ccc"; done



pas besoin du "set":

for i in * ; do echo mv "$i" "$i.ccc"; done


[...]

Que ne marche pas pour les noms de fichier qui commencent par
"-".

--
Stephane
Avatar
Stephane CHAZELAS
2010-10-08, 23:49(+02), Cyrille Lefevre:
Le 08/10/2010 08:40, Dominique MICOLLET a écrit :
Hugolino wrote:

$'n', c'est 'new line' : ton script fonctionnera donc s'il n'est pas
inclu dans un nom de fichier...


En tant que vieux dinosaure barbu programmant depuis une éternité en C,
j'avais reconnu le 'new line'. C'est le $ que je ne comprends pas (je n'ai
non plus lu le fameux manuel).

De plus, j'ai un peu de mal à comprendre le fonctionnement d'IFS. Tel qu'il
est forcé ici, l'espace n'est plus un séparateur : comment bash sépare-t'il
ses arguments ?
Visiblement, il y arrive mais il y a une subtilité qui m'échappe.




Bonjour,

c'est une nouveauté des nouveaux shell, cela équivaut à $(echo 'n')



$(echo 'n') est soit 'n', soit '' (suivant l'implantation de
echo) can $() enleve les LF terminaux.

--
Stephane
Avatar
Gilles
Ref: de Stephane CHAZELAS
2010-10-08, 21:48(+02), Gilles:
Ref: <i8leg0$2e41$ de Cyrille Lefevre
set -- *
for i; do echo mv "$i" "$i.ccc"; done



pas besoin du "set":

for i in * ; do echo mv "$i" "$i.ccc"; done


[...]

Que ne marche pas pour les noms de fichier qui commencent par
"-".



qui *ne commencent pas par* "-"

Et pour éviter ce problème:

for i in ./* ; do echo mv "$i" "$i.ccc"; done
--
Gilles
1 2 3