J'ai un répertoire comme celui-ci:
randomized_quad015.png
randomized_quad030.png
randomized_quad045.png
randomized_quad060.png
randomized_quad075.png
randomized_quad090.png
randomized_quad1005.png
randomized_quad1020.png
randomized_quad1035.png
randomized_quad1050.png
randomized_quad105.png
randomized_quad1065.png
randomized_quad1080.png
randomized_quad1095.png
randomized_quad1110.png
randomized_quad1125.png
randomized_quad1140.png
et je veux renommer les premiers fichiers en ajoutant 0 devant le numéro, comme:
randomized_quad0015.png
Mais je ne sais pas comment. De l'aide?
Comme alternative aux diverses méthodes basées sur Perl dans d'autres réponses, vous pouvez utiliser cet exemple particulier et beaucoup d'autres similaires avec plain bash
:
for i in randomized_quad???.png; do
mv $i randomized_quad0${i#randomized_quad}
done
Cela boucle sur les noms de fichiers avec seulement trois caractères dans la région numérique, et l'expression de variable entre accolades prend chaque nom de fichier, coupe "randomized_quad" au premier plan (avec l'opérateur #) et ajoute "randomized_quad0" au premier plan.
Parmi les autres opérateurs extrêmement utiles comme celui-ci, citons:
%
- couper quelque chose de la fin/
- recherche et remplacement (/
pour la première correspondance, //
pour toutes les correspondances):
- pour extraire des sous-chaînesUne liste plus complète avec des exemples est here . Notez également que ceux-ci utilisent des expressions régulières de style POSIX. Ainsi, .
correspondra à n’importe quel caractère, pas seulement un "." Si vous souhaitez faire correspondre un ".", Vous devez "l'échapper", avec une barre oblique inverse:
TestVariable1="filename.png"
TestVariable2="filename0png"
echo "${TestVariable1%.png}"
> filename
echo "${TestVariable2%.png}"
> filename
echo "${TestVariable1%\.png}"
> filename
echo "${TestVariable2%\.png}"
> filename0png
rename
est un outil de ligne de commande qui vous permet de renommer des fichiers à l'aide de la commande Perl afin de transformer le nom. Une commande Perl couramment utilisée dans cette situation est s/REGEXP/REPLACEMENT/
.
Si j'interprète correctement votre question, vous souhaitez ajouter un 0 en tête dans les noms comportant moins de 4 chiffres, afin que tous les noms finissent par avoir 4 chiffres. Cette expression un peu compliquée traite le cas général où vous avez des noms de fichiers avec 1, 2 ou 3 chiffres: elle les aligne tous sur 4 chiffres. Le modificateur e
à la fin fait en sorte que le remplacement soit interprété non pas comme une chaîne, mais comme une expression Perl. Cette expression répète le chiffre 0
autant de fois que nécessaire pour compléter le nombre à 4 chiffres.
rename 's/(?=([0-9]+)\.)/"0" x (4 - length($1))/e' *.png
Si les fichiers que vous souhaitez renommer ont tous trois chiffres, il existe des méthodes plus simples, telles que
rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png
ou
rename 's/(?<=[^0-9])[0-9]{3}\./0$&/' *.png
rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*
Avec une version récente de bash, vous pouvez écrire:
for f in randomized_quad*.png; do
if [[ $f =~ [1-9][0-9]* ]]; then
new=$(printf "randomized_quad%04d.png" ${BASH_REMATCH[0]})
[[ $f != $new ]] && mv -v $f $new
fi
done