Rename ?

Résolu
eZula Messages postés 3509 Statut Contributeur -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

je n'avais pas eu l'occasion de toucher la commande rename sous shell bash, pour une opération tout ce qu'il y a de plus trivial :

rename REP1.txt REP.txt


ça ne donne rien du tout (même pas un msg d'erreur). J'ai alors cherché un peu sur google et n'ai trouvé que des combinaisons compliquées avec des "mv $i" et bien pire encore. La tournure intuitive de la commande ci-dessus serait-elle teintée de naïveté ?

Merci

PS : rename (util-linux-ng 2.13.1)
Configuration: Linux Suse
Firefox 3.0.2

15 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    dans ton cas tu dois faire
    rename '2.txt' '3.txt' REP2.txt && ls
    3
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Pour ton test initial il faut écrire
    rename '1.txt' '.txt'  REP1.txt
    Dans ton man rename

    rename from to file...

    ce qui veut dire que
    from c'est '1.txt'
    to c'est '.txt'

    donc tu modifies la partie from par la partie to de ton fichier REP1.txt
    ce qui donne REP.txt

    1
  3. jeanbi Messages postés 15399 Date d'inscription   Statut Contributeur Dernière intervention   2 383
     
    bonjour,
    man rename
    rename - Renommer plusieurs fichiers

    SYNOPSIS
    rename [ -v ] perlexpr [ fichiers ]

    DESCRIPTION
    "rename" renomme les fichiers en accord avec la règle spécifiée comme
    premier argument. L’argument perlexpr est une expression Perl qui va
    modifier la chaine Perl "$_" pour au moins un des fichiers spécifiés.
    Si un nom de fichier donné n’est pas modifié par l’expression, il ne
    sera pas renommé. Si aucun nom de fichier n’est fourni, la liste des
    fichiers sera lue sur l’entrée standard.

    Par exemple, pour renommer tous les fichiers correspondant à "*.bak" de
    manière à retirer leur extension, vous pouvez faire

    rename ’s/\e.bak$//’ *.bak

    Pour convertir les majuscules en minuscules, vous feriez

    rename ’y/A-Z/a-z/’ *

    a+
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. eZula Messages postés 3509 Statut Contributeur 392
     
    Merci, mais voici ma manpage de rename :

    RENAME(1) Linux Programmer's Manual RENAME(1)
    NAME
    rename - Rename files
    SYNOPSIS
    rename from to file...
    rename -V
    DESCRIPTION
    rename will rename the specified files by replacing the first occurrence of from in their name by to.
    -V, --version
    Display version information and exit.

    For example, given the files
    foo1, ..., foo9, foo10, ..., foo278, the commands

    rename foo foo0 foo?
    rename foo foo0 foo??

    will turn them into foo001, ..., foo009, foo010, ..., foo278.

    And
    rename .htm .html *.htm

    will fix the extension of your html files.

    SEE ALSO
    mmv(1), mv(1)

    AVAILABILITY
    The rename command is part of the util-linux-ng package and is avail-
    able from ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.

    1 January 2000 RENAME(1)


    j'en ai déduit qu'un simple rename fichier fichier2 pourrait suffire, ou a la rigueur rename from fichier to fichier2, mais non.

    Heu c'est vraiment très con ce que je cherche à faire, renommer un simple fichier. La perlexpr est-elle une fatalité ? comment expliquer le décalage entre la description de la manpage ci-dessus et la complexité de l'opération que tu décris ?
    0
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    pour remplacer REP1.txt avec REP.txt il suffit de supprimer 1 (en fait de le remplacer avec rien plutôt)
    lami20j@debian:~$ touch REP1.txt
    lami20j@debian:~$ ls -l REP1.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:44 REP1.txt
    lami20j@debian:~$ rename 's/1//' REP1.txt
    lami20j@debian:~$ ls -l REP1.txt
    ls: REP1.txt: Aucun fichier ou répertoire de ce type
    lami20j@debian:~$ ls -l REP.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:44 REP.txt
    lami20j@debian:~$

    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Heu c'est vraiment très con ce que je cherche à faire, renommer un simple fichier

    en ce cas pourquoi pas
    mv REP1.txt REP.txt
    0
  8. eZula Messages postés 3509 Statut Contributeur 392
     
    La deuxième solution fonctionne.
    La première non, exemple : remplacer REP2.txt par REP3.txt

    ~/Desktop/compt> ls
    REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt
    
    rename 's/2/3/' REP2.txt && ls
    REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt


    tu utilises quelle version de rename ?
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Voici chez moi
    lami20j@debian:~/eZula$ touch REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt
    lami20j@debian:~/eZula$ ls -l
    total 0
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP1.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP2.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL1.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL2.txt
    -rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL.txt
    lami20j@debian:~/eZula$ rename 's/2/3/' REP2.txt && ls
    REP1.txt  REP3.txt  REP.txt  URL1.txt  URL2.txt  URL.txt


    Mon rename est la fonction de perl 5.8.8

    RENAME(1)                                                                       Perl Programmers Reference Guide                                                                      RENAME(1)
    
    NAME
           rename - renames multiple files
    
    SYNOPSIS
           rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
    
    DESCRIPTION
           "rename" renames the filenames supplied according to the rule specified as the first argument.  The perlexpr argument is a Perl expression which is expected to modify the $_ string in
           Perl for at least some of the filenames specified.  If a given filename is not modified by the expression, it will not be renamed.  If no filenames are given on the command line, file-
           names will be read via standard input.
    
           For example, to rename all files matching "*.bak" to strip the extension, you might say
    
                   rename 's/\.bak$//' *.bak
    
           To translate uppercase names to lower, you'd use
    
                   rename 'y/A-Z/a-z/' *
    
    OPTIONS
           -v, --verbose
                   Verbose: print names of files successfully renamed.
    
           -n, --no-act
                   No Action: show what files would have been renamed.
    
           -f, --force
                   Force: overwrite existing files.
    
    ENVIRONMENT
           No environment variables are used.
    
    AUTHOR
           Larry Wall
    
    SEE ALSO
           mv(1), perl(1)
    
    DIAGNOSTICS
           If you give an invalid Perl expression you'll get a syntax error.
    
    BUGS
           The original "rename" did not check for the existence of target filenames, so had to be used with care.  I hope I've fixed that (Robin Barker).
    
    perl v5.8.8                                                                                2008-04-25                                                                                 RENAME(1)
     Manual page rename(1) line 1/51 (END)          

    0
  10. eZula Messages postés 3509 Statut Contributeur 392
     
    conclusion : ça marche chez toi et surtout nous n'utilisons pas la même version (la tienne est plus récente et plus avancée)
    Je reste un peu sur ma faim, bien que ta deuxième solution soit la plus probablement retenue, car je ne comprends pas pourquoi mon test initial ne fonctionne pas au regard du manpage de cette version util-linux-ng 2.13.1
    0
  11. eZula Messages postés 3509 Statut Contributeur 392
     
    exact, bien vu ;)

    Merci lami20j
    0
  12. eZula Messages postés 3509 Statut Contributeur 392
     
    Mince, là je suis bien embêté avec un pb que j'ai sous-estimé.
    Dans un dossier compt, il y a ces fichiers

    ~/Desktop/compt> ls
    Compteur.txt
    REP1.txt
    REP2.txt


    Le fichier Compteur.txt contient simplement le caractère 2

    Le but de la manip est :
    - initialiser un compteur compt à la valeur du contenu du fichier Compteur.txt (càd 2)
    - par pas de 1 décrémenter ce compteur et renommer les fichiers REP$compt .txt en rep(compt -1).txt
    jusqu'à ce que $compt=0

    Donc en gros :

    REP1.txt -> devient REP0.txt
    REP2.txt -> devient REP1.txt

    et stop

    donc

    compt=$(cat Compteur.txt)
    for i in `seq $compt` ; do j=$(( $compt - 1 ));rename "$compt" "$j" REP$compt.txt ; done


    ça me parait bien cradasse comme code, sans compter que ça ne marche pas. J'ai essayé d'inverser la séquence en utilisant | tac mais c'est pas mieux. Pareil avec les guillemets ou simple ' ça ne change rien. Je me suis perdu avec une boucle while (la condition était : "tant que le compteur est strictement supérieur à zéro, décrémenter ce compteur et renommer" - pour l'arrêt de la boucle).

    Comment procèderiez-vous proprement pour arriver au résultat attendu ?
    0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,
    for i in $(seq $(cat Compteur.txt));do rename "$i.txt" "$(($i-1)).txt" REP*;done
    0
  14. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    [eZula]$ ls
    foo.sh*  REP1.txt  REP2.txt  REP3.txt  REP4.txt
    
    [eZula]$ cat foo.sh
    #! /bin/bash
    
    for i in REP*
    do
    number=$(grep -o '[ [:digit:]]' <<<$i)
    mv ${i} ${i/$number/$(($number -1))}
    done
    
    [eZula]$ ./foo.sh
    
    [eZula]$ ls
    foo.sh*  REP0.txt  REP1.txt  REP2.txt  REP3.txt
    
    [eZula]$  
    L'espace entre les crochets ouvrant de :digit: est à enlevé, c'est à cause de la mise en forme de la balise code se CCM.

    ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      je n'ai pas utilisé mv puisqu'en fait il voulait avec rename du Suse qui est un peu différent par rapport à ce que j'ai par exemple sur Debian ;-))

      sinon avec mv ;-))
      $ ls -1
      Compteur.txt
      REP1.txt
      REP2.txt
      $ for i in $(seq $(cat Compteur.txt));do mv "REP$i.txt" "REP$(($i-1)).txt";done
      $ ls -1
      Compteur.txt
      REP0.txt
      REP1.txt

      0
  15. eZula Messages postés 3509 Statut Contributeur 392
     
    Salut,

    Après réflexion la solution de jipicy a été retenue car cette histoire de compteur n'est au final pas très pratique pour la suite, voire peut être même inutile.

    Donc merci à vous deux
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      de toute façon les 3 solutions font exactement la même chose ;-)
      0