Commande pour renommer fichiers en masse
Résolu
daakon
-
daakon -
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.
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.
A voir également:
- Renommer fichier linux
- Fichier bin - Guide
- Fichier epub - Guide
- Renommer fichier en masse - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
6 réponses
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 ;-)
Un peu de recherche sur CCM et tu aurais trouvé
- avec rename
- avec sed
- avec awk
- avec script
Et un récap en bonus ;-)
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.)
Résultat :
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.
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.
Re,
Regarde bien, tu n'as pas écrit la commande complète.
Regarde bien, tu n'as pas écrit la commande complète.
Certes, il y a la commande
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
3 Programmes avec interfaces graphiques ici :
http://linuxmanua.blogspot.com/2008/07/3-programmes-pour-renommer-en-masse-des.html
http://linuxmanua.blogspot.com/2008/07/3-programmes-pour-renommer-en-masse-des.html
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
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)
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
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