Commande pour renommer fichiers en masse

Résolu/Fermé
daakon - 16 févr. 2009 à 16:45
 daakon - 19 févr. 2009 à 11:37
Bonjour à tous,

Je suis plutôt (voire complètement) inexpérimenté sur Unix et fais appel a vos bienveillants conseils :)


J'ai un repertoire contenant (entre autres) un certain nombre de fichiers sous la forme TOTO(...).txt

-TOTO est une constante

-(...) est une chaine de caractères pouvant contenir des espaces


J'aimerai trouver une commande qui me permette de remplacer tous les espaces de ces fichiers par des underscores.

La finalité de tout ca serait d'inclure cette commande dans un shell existant.

Merci d'avance pour votre aide.

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
16 févr. 2009 à 16:57
Salut,

Un peu de recherche sur CCM et tu aurais trouvé

- avec rename

- avec sed

- avec awk

- avec script

Et un récap en bonus ;-)
1
Merci pour ton aide,

Je devrais pouvoir me débrouiller en faisant un mix de tout ca :)
0
Alors donc,

J'ai essayé les trois dernières methodes proposées avec mv , awk et sed.

Les trois me donnent un résultat identique qui me pose problème.

J'ai un fichier nommé "fichier a renommer.txt" dans le repertoire "file"

Les lignes que j'ai écrites sont les suivantes : (ici avec sed, mais awk et mv donnent le même résultat.)

cd ${file}
for toto in $(ls *); do 
mv $toto $(echo $toto | sed -r 's/\s+/_/g')
done


Résultat :

mv: cannot stat `fichier': No such file or directory
mv: cannot stat `a': No such file or directory
mv: cannot stat `renommer.txt': No such file or directory


On dirait qu'il prend chaque bout de chaine de caractère séparé par un espace pour un fichier à part entière.

Pourtant les commandes ls * ou ls *.txt me ramènent convenablement le fichier à renommer.

J'aurai oublié quelque chose ?

Je vous avouerai que je nage un peu pour le coup.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
18 févr. 2009 à 18:27
Re,
Regarde bien, tu n'as pas écrit la commande complète.
0
Certes, il y a la commande

IFS="\n";


Ce qui m'embête avec ce bout de code c'est que mon "fichier à renommer.txt" va être découpé en "fichier a re" et "ommer.txt" lors de la selection et que du coup le renommage ne fonctionnera pas.

C'est d'autant plus ennuyeux que beaucoup de fichiers que je souhaite renommer vont avoir un préfixe contenant un "n".

J'ai fais quelques recherches infructueuses sur IFS.

Peut-être est il possible de définir autrement les séparateurs par défaut entre fichiers ?

Encore une fois je manque sans doute d'expérience et de recul pour comprendre exactement ce qui se passe dans ce problème.


C'est assez déroutant de voir qu'il y a des tas et des tas de solutions existantes pour arriver au même résultat.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Profil bloqué
18 févr. 2009 à 22:32
3 Programmes avec interfaces graphiques ici :

http://linuxmanua.blogspot.com/2008/07/3-programmes-pour-renommer-en-masse-des.html
0
Merci pour ton aide,

Malheureusement l'objectif serait d'inclure tout ca dans un shell automatisé, et non d'effectuer l'opération ponctuellement.

Ca exclut l'utilisation de programmes comme ceux que tu me proposes.


Merci tout de même pour le coup de main :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
19 févr. 2009 à 10:27
Salut,

Je ne comprends pas.
Dans les exemples que je t'ai donnée, les fichiers contiennent des espaces dans leur nom.
Par exemple avec sed
http://www.commentcamarche.net/forum/affich 3382569 remplacer espacements dans noms de fichier#3

On voit bien que les fichier s'appellent
aaa bbb
ddd eee
ddd eee kdjf
ddd eee kdjf lsdkjfklsd
0
Première bonne nouvelle : Je m'en suis enfin sorti en utilisant la quatrieme méthode proposée : le mv bête et méchant.

Il suffisait de revoir un tout petit peu la syntaxe pour que ca fonctionne
(le malheureux ; avant le done et le -T à changer)

for file in * ; do mv -f "$file" ${file// /_}; done 


Excellent exercice pour un débutant soit dit en passant.



La mauvaise nouvelle c'est que j'ai toujours pas compris pour l'IFS posait problème. Le caractère /n devrait coder pour un retour chariot. Or dans les faits, il prend à la fois les retours chariot séparant les fichiers et les "n" des chaines de caractère.


Dans l'exemple que tu me donnes il faudrait voir ce qui se passe si un de tes fichier est sous la forme

aaa bbb ccncc ddddd

A mon avis ca poserait le même problème.



Le principal étant que je trouve une solution à mon problème, on peut considérer le problème comme résolu.

Merci beaucoup pour ton aide lami20j
0