Renommer fichiers en masse ligne de commande

Résolu
Abdenago -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Voilà, je voudrais renommer 242 fichiers en ligne de commande. Les noms doivent etre des nombres consécutifs, si vous avez ça..

truc.zip ; machin.zip ; bidule.zip ===> 1.zip ; 2.zip ; 3.zip

8 réponses

  1. initials 76
     
    J'ai trouvé :D

    initials@alexis:~/test$ touch {toto,titi,tata,tutu}.txt
    initials@alexis:~/test$ ls 
    tata.txt  titi.txt  toto.txt  tutu.txt 
    initials@alexis:~/test$ j=0; for f in *.txt; do let j+=1; mv -v "$f" "$j.txt"; done 
    « tata.txt » -> « 1.txt » 
    « titi.txt » -> « 2.txt » 
    « toto.txt » -> « 3.txt » 
    « tutu.txt » -> « 4.txt » 
    initials@alexis:~/test$ 


    If you want to go quickly, go alone. If you want to go far, go together.
    2
    1. initials 76
       
      Abdenago ça t'intéresse plus?
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Apparemment non ;-(

      Ça devait être du genre pressé qui veut du tout cuit ;-\
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    $ tree
    .
    |-- fich1.zip
    |-- fich2.zip
    '-- rep
        |-- fich3.zip
        |-- fich4.zip
        |-- rep1
        |   |-- sous-rep1
        |   |   |-- fich5.zip
        |   |   '-- fich6.zip
        |   '-- sous-rep2
        |       |-- fich5.zip
        |       '-- fich6.zip
        '-- rep2
            |-- sous-rep1
            |   |-- fich7.zip
            |   '-- fich8.zip
            '-- sous-rep2
                |-- fich7.zip
                '-- fich8.zip
    
    7 directories, 12 files
    
    $ i=0; for file in $( find . -type f -name "*.zip"); do name=$(basename $file);rep=$(dirname $file); mv -v $rep/$name $rep/$i.zip;((i++)); done
    
    './fich2.zip' -> './0.zip'
    './fich1.zip' -> './1.zip'
    './rep/fich4.zip' -> './rep/2.zip'
    './rep/fich3.zip' -> './rep/3.zip'
    './rep/rep2/sous-rep2/fich8.zip' -> './rep/rep2/sous-rep2/4.zip'
    './rep/rep2/sous-rep2/fich7.zip' -> './rep/rep2/sous-rep2/5.zip'
    './rep/rep2/sous-rep1/fich8.zip' -> './rep/rep2/sous-rep1/6.zip'
    './rep/rep2/sous-rep1/fich7.zip' -> './rep/rep2/sous-rep1/7.zip'
    './rep/rep1/sous-rep2/fich6.zip' -> './rep/rep1/sous-rep2/8.zip'
    './rep/rep1/sous-rep2/fich5.zip' -> './rep/rep1/sous-rep2/9.zip'
    './rep/rep1/sous-rep1/fich6.zip' -> './rep/rep1/sous-rep1/10.zip'
    './rep/rep1/sous-rep1/fich5.zip' -> './rep/rep1/sous-rep1/11.zip'
    
    $ tree
    .
    |-- 0.zip
    |-- 1.zip
    '-- rep
        |-- 2.zip
        |-- 3.zip
        |-- rep1
        |   |-- sous-rep1
        |   |   |-- 10.zip
        |   |   '-- 11.zip
        |   '-- sous-rep2
        |       |-- 8.zip
        |       '-- 9.zip
        '-- rep2
            |-- sous-rep1
            |   |-- 6.zip
            |   '-- 7.zip
            '-- sous-rep2
                |-- 4.zip
                '-- 5.zip
    
    7 directories, 12 files
    
    $

    ;-))

    Pour plus de clarté dans le code...

    i=0 ;
    for file in $( find . -type f -name "*.zip") ;
    do name=$(basename $file) ;
    rep=$(dirname $file) ;
    mv -v $rep/$name $rep/$i.zip ;
    ((i++)) ;
    done
    2
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    T'as essayé quoi pour l'instant ?
    0
  4. Abdenago
     
    Eh bien je n'ai rien essayé puisque je n'ai rien trouvé.. ! :-(
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Abdenago
     
    Bonjour à TOUS,

    Je n'ai pas eu accès à un internet pendant un certain temps, n'en déplaise à certain.
    Merci à initials 76, j'ai pu bidouiller un peu avec ta méthode et j'ai réussi tant bien que mal! :-) Certains commentaires désobligeants sont à éviter je pense (zipe31) pour entretenir de bonnes relations..

    Merci beaucoup! Résolu! :-)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Et tu m'en vois tout confus et tout heureux de tomber sur l'exception qui confirme la règle ;-))
      0
    2. Abdenago
       
      Ne t'en fais pas, c'est pardonné! :)
      0
    3. initials 76
       
      Cool ^^

      Il ne faut pas en vouloir à Zipe31, en général les demandes de ce genre sont des demandes
      d'exercices et lorsque la réponse tombe, le demandeur ne revient jamais ;-)

      Content d'avoir pu t'aider, j'ai appris en même temps ;-)
      0
    4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,


      j'ai appris en même temps ;-)


      Tu peux toujours faire des économies de frappes;-)

      touch {toto,titi,tata,tutu}.txt 
      touch t{oto,iti,ata,utu}.txt
      0
    5. initials 76
       
      Salut :)

      Hé hé oui aussi il fallait y penser, merci ;-)
      0
  7. Abdenago
     
    HEELP!

    Est il possible de faire un truc comme ça?

    find . -name '*.zip' | xargs j=0; for f in *.zip; do let j+=1; mv -v "$f" "$j.zip"; done


    :)

    merci
    0
    1. initials 76
       
      Chez moi ça fonctionne, mais j'ai du ajouter un point-virgule après la commande xargs pour ne plus avoir le message d'erreur :
      xargs : j=0 : aucun répertoire de ce type


      C'est nécessaire d'utiliser find quand on utilises for f in *.zip?
      La commande find ici s'applique au répertoire courant, non?

      :)
      0
    2. Abdenago
       
      En fait je voudrais renommer aussi les fichier des sous-répertoires, c'est pour ça ;)
      0
  8. Abdenago
     
    Je met un point virgule, ça tourne mais ça ne renomme que les fichiers présents dans le répertoire courant :/ et pas la totalité des fichiers trouvé par find :(
    0
    1. initials 76
       
      Si tu veux chercher à partir de la racine c'est en root avec
      find / -name


      dans le répertoire précédent et courant j'ai utilisé ça :
      find ./ ../ -name 


      Mais fais gaffe au fichiers système.
      0
    2. Abdenago
       
      Moi ce que je veux, c'est seulement les fichiers qui se trouvent dans le répertoire dans lequel je me trouve, ET dans ses sous-répertoires
      0
    3. Abdenago
       
      Le find marche hein!
      find ./Bureau/essai -name '*.zip'
      ==> je trouve tous les fichiers zip qui se trouvent dans le répertoire courant + ceux des sous répertoires.

      mais quand je fais:
      find ./Bureau/essai -name '*.zip' | exec; j=0; for f in *.zip; do let j+=1; mv -v "$f" "$j.zip"; done  
      

      ==> Il ne renomme que les fichiers du répertoire courant! je pense qu'il y a un problème avec 'exec'
      0