Commande pour renommer fichiers en masse [Résolu/Fermé]

Signaler
-
 daakon -
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

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 536
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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Merci pour ton aide,

Je devrais pouvoir me débrouiller en faisant un mix de tout ca :)
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.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 536
Re,
Regarde bien, tu n'as pas écrit la commande complète.
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.

3 Programmes avec interfaces graphiques ici :

http://linuxmanua.blogspot.com/2008/07/3-programmes-pour-renommer-en-masse-des.html
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 :)
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 536
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
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