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
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
Ref: <4cad9007$0$21886$426a34cc@news.free.fr> 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:
gilles@vubuntu:~/tmp$ touch "a b" "c d"
gilles@vubuntu:~/tmp$ ls -1
a b
c d
gilles@vubuntu:~/tmp$ for i in * ; do mv -v "$i" "$i.cc" ; done
`a b' -> `a b.cc'
`c d' -> `c d.cc'
gilles@vubuntu:~/tmp$ ls -1
a b.cc
c d.cc
et d'ailleurs:
gilles@vubuntu:~/tmp$ set *
gilles@vubuntu:~/tmp$ echo $#
2
^-- et pas 4!
alors que, par contre et bien entendu:
gilles@vubuntu:~/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
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
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
Ref: <i8leg0$2e41$1@talisker.lacave.net> de Cyrille Lefevre
... après avoir supprimé le "echo" bien entendu -- Gilles
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.
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%nospam@laposte.net.invalid
supprimer "%nospam% et ".invalid" pour me repondre.
$'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.
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.
Le 08/10/2010 21:48, Gilles a écrit :
Ref: <i8leg0$2e41$1@talisker.lacave.net> 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%nospam@laposte.net.invalid
supprimer "%nospam% et ".invalid" pour me repondre.
Que ne marche pas pour les noms de fichier qui commencent par "-".
-- Stephane
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
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.
$'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
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
Ref: <slrnib42v7.g0b.stephane.chazelas@spam.is.invalid> de Stephane CHAZELAS
2010-10-08, 21:48(+02), Gilles:
Ref: <i8leg0$2e41$1@talisker.lacave.net> 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