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 png
et la svg
version des fichiers 03
et 09
ci-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.
Ce serait plus facile dans zsh, où vous pouvez utiliser
On
qualificatif glob pour trier les correspondances dans l'ordre décroissant (etn
pour 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:WIDTH::FILLER:)
indicateur d'extension de paramètre pour remplir tous les nombres à la même largeur (la largeur du plus grand nombre).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).
la source
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.
la source
Plus facile:
Tu auras:
la source
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ère
rene ?.*/#7-80 %?.* B
incré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/la source