Forum Programmation.shell Besoin d'aide pour un petit script de renommage

Posté par  .
Étiquettes : aucune
0
22
oct.
2007
Bonjour à tous,
En ce moment, j'ai un peu le cerveau en compote et la programmation shell n'arrangeant pas vraiment les choses, je requière votre aide.
Je voudrais faire un script qui reçoive deux noms de fichiers :
pattern1.ext1 et pattern2.ext2
et je voudrais (tout simplement), renommer le premier fichier en :
pattern2.ext1

Merci d'avance pour le prêt de vos neurones !
  • # mmv

    Posté par  (site web personnel) . Évalué à 3.

    Sous debian, mmv fait ce que tu demandes :

    mmv "toto*.*" "#1.#2" renommmera

    "totoPLOP.jpg" en "PLOP.jpg"
  • # Utilise cut, en fixant le point comme délimiteur

    Posté par  . Évalué à 1.

    Utilise cut pour découper tes noms de fichiers, avec l'option -d suivie d'un caractère qui sert de "délimiteur" (ici le point, donc -d. ).
    Ensuite, fX permet de récupérer le X-ième morceau suite au découpage précédent.


    patern=`echo "$2" | cut -d. f1`
    ext=`echo "$1" | cut -d. f2`
    mv $1 $patern.$ext
  • # Une fonction du shell

    Posté par  (site web personnel) . Évalué à 3.

     renomme () { mv -v "$1" "${2%.*}.${1#*.}" ; }
    
    • [^] # Re: Une fonction du shell

      Posté par  . Évalué à 4.

      Je crois que c'est tout à fait ce que je cherchais. En revanche, il vaut mieux indiquer un double ## pour gérer correctement les noms de fichiers qui contiennent des points :

      mv "$1" "${2%.*}.${1##*.}"

      L'explication de la ligne pour ceux que ça intéresse (dont moi !) :

      * ${2%.*} : on cherche un pattern qui commence par un point suivi de caractères (.*), donc en gros, on cherche l'extension du fichier. On retire ce pattern du contenu de la variable ${2}. Mais attention, on ne veut retirer que le plus petit pattern qui correspond avec notre expression (%). Example :
      file="/path/to/the/file.sfx.tar"; tmp=${file%.*}; echo $tmp donnera /path/to/the/file.sfx.
      Alors qu'avec l'utilisation de %%, qui cette fois, retire la plus grande correspondance avec l'expression :
      file="/path/to/the/file.sfx.tar"; tmp=${file%%.*}; echo $tmp donnera /path/to/the/file, puisque .sfx.tar correspond à l'expression .*.

      * ${1##*.} : ce coup ci, on cherche à retirer l'expression inverse, c'est à dire des caractères suivi d'un point (.*), afin d'isoler le suffixe. L'emploi du double dièse ## signifie qu'on cherche la plus grande correspondance possible avec l'expression (ce qui donnera donc le plus petit suffixe). Example :
      file="/path/to/the/file.sfx.tar"; tmp=${file##*.}; echo $tmp donnera tar.
      En revanche, avec l'utilisation de #, qui retire la plus petite correspondance :
      file="/path/to/the/file.sfx.tar"; tmp=${file#*.}; echo $tmp donnera sfx.tar.

Suivre le flux des commentaires

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