Forum Linux.débutant Renommer plusieurs fichiers en même temps

Posté par .
Tags : aucun
2
12
sept.
2011

Bonjour,

Pour situer en premier, je ne connais pas du tout Linux, je me trouver contraint dans le cadre de mon travail à récupérer des fichiers de sauvegardes sur une machine qui tourne en linux sur un PC distant chez un client. En cherchant, pas de problèmes pour le plus gros.
Mon soucis, c'est que j'ai 500 fichiers qui ne passent pas en FTP parce que leur nom sous linux contient des métacaractères (certains ">", d'autres "/")
Je les ai copiés dans un répertoire à part, et j'aimerai les renommer en masse pour supprimer ces caractères.

J'ai beau regarder sur le net, je ne trouve pas de solution que j'arrive à mettre en oeuvre.

Si quelqu'un pouvait me donner des clefs. J'ai cru comprendre qu'avec sed je devrais pouvoir faire qq chose, mais je sens bien que mon esprit formaté culture MS-DOS à du mal, et je ne pige pas tout.

Je ne suis pas du tout informaticien, juste un utilisateur de machine un peu éclairé.
Merci à vous

  • # rename et les regexp

    Posté par . Évalué à 1.

    rename 's/motif à purger/motif de remplacement/g' *

    evidemment il faut connaitre les regexp pour bien utiliser l'outil
    mais txt2regex est là pour t'aider

    • [^] # Re: rename et les regexp

      Posté par . Évalué à 0.

      Je n'ai pas la fonction Rename sur le PC distant .... :(

      • [^] # Re: rename et les regexp

        Posté par . Évalué à 2.

        Sache toutefois que, sous Unix, tout ou presque est case-sensitive. Tu dois donc respecter majuscules et minuscules mais pas d'inquiétude : en général, tout est écrit en minuscules.

  • # Renommer des fichiers en masse avec linux

    Posté par (page perso) . Évalué à 1.

    http://6v8.gamboni.org/Renommer-des-fichiers-en-masse.html

    Tout est bien expliqué. Tu as juste à changer ".php3" par "<" (pour remplacer tes "<" par autre chose "_" par exemple, le "\" permettant de dire que "<" est un caractère du nom de fichier (\ est un caractère d'échappement)

  • # Rename

    Posté par (page perso) . Évalué à 1.

    Si tu as perl d'installé sur ta machine distante, tu as (normalement) accès à la commande "rename"

    Très simple, cette commande permet de renommer des fichiers via une regex perl.

    Example:
    rename 's/>/_/g' *
    => renomme tous les fichiers en remplaçant tous les '>' en '_'.

    Et tu peux voir le résultat de la commande SANS renommer avec l'option -n

    Pour tes '/', ta regex ressemblera à ça : 's/\//_/g' ou à 's#/#_#g'

    It's a fez. I wear a fez now. Fezes are cool !

    • [^] # Re: Rename

      Posté par . Évalué à 1.

      Note que la syntaxe de "rename" varie en fonction de la distribution installée.

      Sous debian, on trouve (en tout cas par défaut) cette version « perl », mais il y a une autre version de rename dans util-linux : http://linux.die.net/man/1/rename

  • # Identifier les caractères à remplacer, et par quoi.

    Posté par . Évalué à 2.

    D'abord il serait intéressant que tu nous indiques de façon exhaustive quels sont les caractères à remplacer.

    Ensuite comme tu l'as dit, sed est ton ami, mais ça ne suffira pas. sed pourra t'aider à générer le nouveau nom, mais ce n'est pas lui qui renommera tes fichiers: c'est la commande mv.

    Come tu débutes, l'idéal à mon avis serait que tu procèdes par étapes :

    • dans un premier temps générer une liste des fichiers source dans un fichier via find par exemple. Un truc du genre "cd rep_ou_sont_mes_fichiers; find . >/tmp/liste_fichiers.txt"

    • ensuite remplacer toutes les occurences de tes caractères "bizarres" par un nouveau caractère : un truc du genre
      >/tmp/fichier_cmd
      while read a
      do
      echo "mv $a /chemin/vers/cible/$(echo $a | sed 's/caractere_a_remplacer/nouveau_caractere/g')" >>/tmp/fichier_cmd
      done

    • tu vérifies que fichier_cmd contient bien ce que tu veux, et que les caracteres que tu ne veux pas sont bien supprimés comme demandé.

    Ensuite tu fais un sh /tmp/fichier_cmd pour exécuter la copie (en te positionnant bien dans le répertoire contenant les fichier que tu as copiés.

    Si tu veux pouvoir rejouer pulsieurs fois le script, tu fais une copie (cp) à la place du renommage (mv). en cas de problème tu n'auras qu'à supprimer les copies et recommencer.

    Je n'ai pas testé le truc, c'est juste une piste. Dans le détail il y aura peut-être quelques améliorations à faire. En tout cas pour ma part c'est à peu près ce que je ferais (peut-être en utilisant awk au lieu de sed mais c'est une autre histoire).

    • [^] # Re: Identifier les caractères à remplacer, et par quoi.

      Posté par . Évalué à 0.

      OK, je vois un peu l'idée.

      Concernant sed, dans le lien donné plus haut, le vois que pour générer le flux de fichiers traités par sed, il utilise la commande ls et pas mv pour faire le renommage. Du coup je pensais que c'était bien sed qui allait nommer mes fichiers.

      Pour revenir à mon cas, j'ai copié dans un répertoire les fichiers gênants, afin de pouvoir faire des tests sans risques.

      Chaque fichier génant contient 1 métacaractère. Soit * : \ ou >

      J'ai compris comment les lister ou les copier en utilisant \ devant le caractère.

      Et là je tatonais avec sed ...

      Ton exemple est clair, je pense facilement pouvoir faire un fichier contenant la liste des fichiers génants (1 fichier par type de caractère par exemple)

      • [^] # Re: Identifier les caractères à remplacer, et par quoi.

        Posté par . Évalué à 3.

        juste un truc comme ça en bash ça ne suffit pas (boucle for, commande mv, et translation tr) ?

        for f in *; do mv "$f" "$(echo $f | tr ':*\\>' '_')"; done
        
        
        • [^] # Re: Identifier les caractères à remplacer, et par quoi.

          Posté par . Évalué à 1.

          Un instant j'ai cru que c'était la super solution.
          Ca a bien fonctionné pour le caractère ":", mais je n'avais qu'un seul fichier comme ça.
          Pour les autres caractères, cela ne semble pas fonctionner ...

          Je fais des tests pour comprendre le fonctionnement.

          En tout cas merci à tous pour les pistes que vous me donnez

          • [^] # Re: Identifier les caractères à remplacer, et par quoi.

            Posté par . Évalué à 1.

            En fait c'est nickel, j'ai du modifier un brin la syntaxe et ça marche au poil, merci!

            • [^] # Re: Identifier les caractères à remplacer, et par quoi.

              Posté par . Évalué à 2.

              il y a plus simple normalement, il faut installer le programme "detox", qui va remplacer tous les caractères qui ne vont pas par d'autres : http://detox.sourceforge.net/

              Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

              • [^] # Re: Identifier les caractères à remplacer, et par quoi.

                Posté par . Évalué à 2.

                Encore faut-il pouvoir installer ce que l'onveut sur la machine, ce qui est souvent loin d'être le cas en milieu pro.

                • [^] # Re: Identifier les caractères à remplacer, et par quoi.

                  Posté par . Évalué à 3.

                  effectivement. Néanmoins ce programme en mode texte est facilement compilable dans le répertoire utilisateur, et il se lance depuis le dossier de compilation, sans nécessiter de droits supplémentaires (je suppose qu'il a accès à un shell à distance, vu qu'il parle de renommage avec sed et compagnie)

                  Plus simple encore, il parle de récupérer les fichiers par ftp. En ce cas, autant compresser le dossier de sauvegarde, et faire passer un unique fichier plutôt que 500 fichiers, ça m'étonne que personne ne l'ait déjà suggéré. La commande tar cfvz archive.tgz dossier_de_sauvegarde fera l'affaire, normalement les lettres merdiques dans les fichiers passent dans le fichier d'archive (je viens de tester avec un nom comme "coin\_°<" ça archive sans problème...). Peut-être que cela sera plus difficile à lire sous windows cependant.

                  Ça pourrait être intéressant de savoir avant toute chose pourquoi un serveur linux génère des noms de fichiers aussi idiots...

                  Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

                  • [^] # Re: Identifier les caractères à remplacer, et par quoi.

                    Posté par . Évalué à 2.

                    pour récupérer, compiler et utiliser le programme :

                    wget http://downloads.sourceforge.net/sourceforge/detox/detox-1.2.0.tar.bz2
                    tar xfvj detox-1.2.0.tar.bz2
                    cd detox-1.2.0/
                    ./configure && make
                    touch "coin \_°< coin"
                    ./detox ./*
                    
                    

                    Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

                    • [^] # Re: Identifier les caractères à remplacer, et par quoi.

                      Posté par . Évalué à 2.

                      "compiler" : la machine doi disposer de ce qu'il faut pour compiler .... on en revient au point précédent.

                      • [^] # Re: Identifier les caractères à remplacer, et par quoi.

                        Posté par . Évalué à 2.

                        il doit quand même y avoir tar pour faire une archive de tous ces fichiers.

                        Et peut-être que si la machine n'a pas gcc, il n'y a pas non plus util-linux ni même bash (busybox etc)

                        le gars demande des pistes pour arranger ses fichiers, on lui donne ce qui existe...

                        Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

  • # zmv avec zsh

    Posté par . Évalué à 2.

    ...qui permet de faire un renommage dans le genre: zmv -W 'anicenprefix_*.abc' 'nouveauprefix_*.abc'

  • # Renommer en mode graphique

    Posté par . Évalué à -2.

    Bonjour,

    pour les débutants retissant à la ligne de commande vous pouvez utiliser pyRenamer qui gère aussi les expressions régulières mais aussi a des filtres prédéfinis : substitutions, insérer/effacer, renommage manuel, images, Musique, incorporer les sous-répertoires.

    http://www.infinicode.org/code/pyrenamer/

  • # Thunar

    Posté par (page perso) . Évalué à 0.

    En ce moment je n'ai pas Thunar installé (le gestionnaire de fichier de Xfce), mais celui-ci permettait de renommer plusieurs fichiers avec pas mal d'options (préfixe, suffixe, remplacement de caractères, incrémentation...)

    http://thunar.xfce.org/pwiki/documentation/bulk_renamer

  • # faire un tgz?

    Posté par (page perso) . Évalué à 1.

    Et en faisant un gros tgz de tes fichiers? ou un zip si tu préfères, comme ça tu le nommes comme tu veux et il passe par ftp non?

    tar zcvf archive.tgz <tout tes fichiers>
    
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.