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?
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.
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.
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.