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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #22653061
* 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).



Il y a plusieurs solutions, la page suivante donne des explications
détaillées :
http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

--
DW
Dominique MICOLLET
Le #22653051
Dominique MICOLLET wrote:




....Un problème avec des noms à espace




En fouillant sur internet, j'ai trouvé la solution
___$ IFS=$'n'

Ça marche mais, maintenant, il faut que je comprenne ce que représente $'n'
(IFS, je sais :-)

Cordialement.

--
Dominique MICOLLET
Adresse email : enlever deux francs
Hugolino
Le #22655021
Le 07-10-2010, Dominique MICOLLET
Dominique MICOLLET wrote:

>
....Un problème avec des noms à espace
>

En fouillant sur internet, j'ai trouvé la solution
___$ IFS=$'n'

Ça marche mais, maintenant, il faut que je comprenne ce que représente $'n'
(IFS, je sais :-)



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

Cordialement.



for file in `find . -maxdepth 1 -type f `
do
File_Orig=${file}
File_Dest=`echo "${File_Orig}" | sed -e 's/ */_/g'`
ln "${File_Orig}" "${File_Dest}"
done

remplace n'importe quel nombre d'espace par un "_"


--
je suis assez têtu et utilise toujours Linux en root et en voulant effacer
tous les fichiers dans un repertoire j'ai fait un rm -fr * or en tapant sur
entree je me suis rendu compte que je suis sur / : oooooooups
-+- T in Guide du linuxien pervers : "Et paf le tétu" -+-
Cyrille Lefevre
Le #22655141
Le 07/10/2010 11:16, Dominique MICOLLET a écrit :
Bonjour

Soit un répertoire contenant un paquet de fichiers dont les noms cont iennent
des espaces.
Je souhaire faire une opération répétitive sur ces fichiers, en b ash (1).
Lorsque je fais la commande à la main et que j'utilise la completion
automatique, bash échappe automatiquement les blancs en les préfixa nt 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égiqu es, sans
succès.

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



Bonjour,

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

les " sont importants
for sans do implique for i in "$@", soit tous les arguments positionnels
ces derniers étant positionnées via set -- * qui se débrouille trè s bien
avec les noms de fichier comprenant des espaces.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Dominique MICOLLET
Le #22655671
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.



Cordialement.



for file in `find . -maxdepth 1 -type f `
do
File_Orig=${file}
File_Dest=`echo "${File_Orig}" | sed -e 's/ */_/g'`
ln "${File_Orig}" "${File_Dest}"
done

remplace n'importe quel nombre d'espace par un "_"





--
Dominique MICOLLET
Adresse email : enlever deux francs
Dominique MICOLLET
Le #22655661
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.


Merci pour le renseignement.
--
Dominique MICOLLET
Adresse email : enlever deux francs
Dominique MICOLLET
Le #22655651
Hugolino wrote:

for file in `find . -maxdepth 1 -type f `


..
done

remplace n'importe quel nombre d'espace par un "_"


Je ne peux pas substituer les blancs. Comme écrit dans l'article original,
je veux réaliser un trombinoscope avec la commande montage de
graphicsmagick : le nom de l'étudiant est celui de son fichier image.

Ceci étant je mets ce script de coté car, dans toutes les autres situations,
je fuis comme la peste les espaces dans les noms de fichier.

Merci.


--
Dominique MICOLLET
Adresse email : enlever deux francs
Dominique MICOLLET
Le #22655731
Cyrille Lefevre wrote:
set -- *
for i; do echo mv "$i" "$i.ccc"; done



Waouh. Pour moi, cela est de la haute voltige. Sans les explications que
vous donnez ensuite, je n'y aurais rien compris (d'ailleurs même avec le
help set j'ai un peu de mal à comprendre : pourquoi -- et pas
seulement - ?)

Merci.
--
Dominique MICOLLET
Adresse email : enlever deux francs
Dominique MICOLLET
Le #22655721
Merci à tous pour vos précieuses suggestions.

Cordialement.
--
Dominique MICOLLET
Adresse email : enlever deux francs
Stephane CHAZELAS
Le #22656191
2010-10-07, 11:16(+02), 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 ?


[...]

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

ou

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


ou (zsh)

zmv '*' '$f.ccc'

(apres un autoload -U zmv (dans le ~/.zshrc typiquement))

ou (toujours zsh)

wmv * *.ccc

apres

autoload -U zmv
alias wmv='noglob zmv -W'

ou (toujours zsh)

for i (*) mv $i $i.ccc

(zsh n'as pas herité le bug des autres shell qui font du word
splitting à l'expansion des variables)

ou avec mmv:

mmv '*' '#1.ccc'

--
Stephane
Publicité
Poster une réponse
Anonyme