Renommer des fichiers en incrémentant un nombre dans le nom de fichier


14

J'ai un répertoire qui contient des fichiers image numérotés, quelque chose comme ceci:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

Parfois, il peut y avoir plusieurs versions d'un fichier dans différents formats (par exemple, a pnget la svgversion des fichiers 03et 09ci-dessus), mais les nombres sont sinon consécutifs. En règle générale, il y a entre 40 et 80 fichiers de ce type dans chaque répertoire. Les nombres correspondent à l'ordre dans lequel ces images apparaissent dans un manuscrit (un document Word, mais ce n'est pas important). Il n'y a pas d'autre moyen de déterminer l'ordre des images.

Si j'ajoute une nouvelle image au manuscrit, je dois placer une copie de l'image dans ce répertoire avec la numérotation correcte. Donc, si la nouvelle image est la cinquième du manuscrit, je dois renommer les fichiers du répertoire afin de lui faire de la place:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

Quel est le moyen le plus simple à partir de la ligne de commande ou d'un script ou d'une macro pour renuméroter tous les fichiers à partir d'un certain nombre? J'ai une installation standard de Fedora Linux utilisant bash.

Réponses:


11

Je pense qu'il devrait faire le travail:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

Le script prend un paramètre - nombre de vous nouvelle image.

PS. Mettez le script dans un autre répertoire que vos images. Dans le répertoire d'images, il ne devrait y avoir que des images nommées de la manière que vous avez décrite.


Cela semble prometteur, je vais l'essayer dans quelques heures quand je serai de retour sur mon ordinateur portable.
robertc

Cela ne fonctionnera que si votre nom de fichier n'est pas préfixé par des caractères non numériques
mems

@mems L'OP indique clairement que les noms de fichiers commencent par un nombre
xhienne

2

Ce serait plus facile dans zsh, où vous pouvez utiliser

  • le On qualificatif glob pour trier les correspondances dans l'ordre décroissant (et npour utiliser l'ordre numérique, au cas où les noms de fichiers n'ont pas tous des zéros de tête à la même largeur);
  • l' (l:WIDTH::FILLER:) indicateur d'extension de paramètre pour remplir tous les nombres à la même largeur (la largeur du plus grand nombre).
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

En bash, voici un script qui suppose que les fichiers sont remplis à une largeur fixe (sinon, le script ne renommera pas les bons fichiers) et remplit à une largeur fixe (qui doit être spécifiée).

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

Ce problème exact est traité dans cet article . Notez que vous devrez le modifier pour prendre en charge les formats SVG et PNG, en ajoutant une deuxième étape MV.


Je ne pense pas que ce soit le problème exact, cela va renuméroter toutes les images à chaque fois. Je veux juste renuméroter les images à partir d'un point particulier.
robertc

1

Plus facile:

touch file`ls file* | wc -l`.ext

Tu auras:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

Comment ajouter le zéro de tête pour 1-9? Souvenez-vous également qu'il peut y avoir deux fichiers 03.png et 03.svg.
robertc

1

Il ne semble pas y avoir beaucoup d'intérêt récent pour cette question mais, si quelqu'un tombe dessus, il y a trois problèmes ici. L'une consiste à sélectionner des fichiers à renommer en fonction de critères sémantiques (la plage n'est pas lexicale et ne peut pas être spécifiée par des caractères génériques ou même des expressions régulières - la théorie des automates dit que c'est plus complexe qu'un NFA). La seconde est de savoir comment changer un nom en modifiant une partie de celui-ci. Le troisième est de savoir comment éviter la collision de noms. Un script dans Bash et de nombreuses autres langues peut effectuer cette transformation spécifique, mais la plupart d'entre nous préfèrent ne pas avoir à écrire un programme chaque fois que nous voulons renommer un tas de fichiers. Avec mon (gratuit et open source) rene.py, vous pouvez faire ce que vous voulez, mais il faut deux invocations pour éviter le problème de collision de noms. Premièrerene ?.*/#7-80 %?.* Bincrémente tous les noms de la plage, en ajoutant un préfixe de% pour éviter les noms existants. rene %* *Supprime ensuite ce préfixe des fichiers qui l'ont. Je décris cela à https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.