Commande pour renommer fichiers en masse

Résolu
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.

6 réponses

  1. daakon
     
    Merci pour ton aide,

    Je devrais pouvoir me débrouiller en faisant un mix de tout ca :)
    0
  2. daakon
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,
    Regarde bien, tu n'as pas écrit la commande complète.
    0
    1. daakon
       
      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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Profil bloqué
     
    3 Programmes avec interfaces graphiques ici :

    http://linuxmanua.blogspot.com/2008/07/3-programmes-pour-renommer-en-masse-des.html
    0
    1. daakon
       
      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
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. daakon
       
      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