web-dev-qa-db-fra.com

Comment renommer des fichiers avec count?

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?

5
nkint

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înes

Une 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
4
Aesin

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
6
Gilles
rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*
0
January

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
0
glenn jackman