web-dev-qa-db-fra.com

Batch / Multi renommer uniquement les fichiers avec une plage de numéros spécifique

J'ai une situation où j'ai ce qui suit:

file01.ext
.
.
.
file99.ext
file100.ext
.
.
.

Et je veux (en utilisant renommer) insérer le '0' pour les fichiers 01-99 (afin qu'ils deviennent 000-099) mais ne pas modifier les fichiers plus grand que 100. Quelle expression dois-je utiliser et quelle est la bonne source d'apprentissage régulier expressions telles que celles-ci?

Sous Windows, j'aurais utilisé la fonction de renommage multiple de Total Commander, qui utilise une syntaxe de renommage très simple. Existe-t-il de bonnes alternatives pour cet outil (multi-renommer) pour Ubuntu?

4
user300704

Utilisation de rename

Un outil généralement utile pour ce type d'activité est rename du package Perl. Il applique une substitution Perl au nom du fichier:

rename 's/file/file0/' file[0-9][0-9].ext

Comment ça marche:

  • s/file/file0/

    Ceci est une commande de substitution Perl. Il remplace l'occurrence de file dans un nom de fichier par file0.

  • file[0-9][0-9].ext

    Voici la liste des fichiers sur lesquels rename doit être utilisé. [0-9] signifie n'importe quel nombre compris entre 0 et 9. [0-9][0-9] signifie deux nombres quelconques, l'un après l'autre.

La page de manuel pour rename est ici .

Remarque: Ceci nécessite la version Perl de rename. Il existe également un rename utilitaire qui fait partie de util-linux mais il fonctionne différemment.

Utilisation de bash

Cette approche utilise une boucle for combinée avec substitution de modèle:

for f in file[0-9][0-9].ext; do mv "$f" "${f/file/file0}"; done

Comment ça fonctionne:

  • for f in file[0-9][0-9].ext; do

    Cela démarre une boucle sur chaque nom de fichier correspondant au glob file[0-9][0-9].ext.

  • mv "$f" "${f/file/file0}"

    Ceci renomme les fichiers en utilisant substitution de modèle de bash. Il remplace file par file0` dans le nom du fichier.

  • done

    Ceci marque la fin de la boucle for.

Cette approche nécessite bash (ou un autre shell avancé).

bash est le shell interactif par défaut et cette approche fonctionnera sous bash. Ainsi, cela devrait fonctionner sur la ligne de commande habituelle.

5
John1024

Ce renommer en utilisant différentes expressions rationnelles:

rename -n 's/[^0-9](([0-9]){2})\.ext$/0$1.ext/' *

[^0-9](([0-9]){2})\.ext$ Correspond à n'importe quel non-chiffre[^0-9] suivi d'un groupe de nombres de longueur = 2 qui se termine par .ext. Donc, dans la pièce de rechange, ajoutez un 0 et imprime le groupe de $1 correspondants, puis leur extension.

Ou alternative pour regex:

rename -n 's/[^\d](\d{2})\.ext$/0$1.ext/' *

\d correspond à un nombre.

1
αғsнιη