Comment zéro pad nombres dans les noms de fichiers en Bash?
Quel est le meilleur moyen, à l'aide de Bash, de renommer des fichiers sous la forme:
(foo1, foo2, ..., foo1300, ..., fooN)
Avec des zéros noms de fichier:
(foo00001, foo00002, ..., foo01300, ..., fooN)
Vous devez vous connecter pour publier un commentaire.
En cas
N
n'est a priori pas fixe:rename
utilitaire. Sur une note de côté, cette solution n'a bande les "extensions de fichier" pour les fichiers que je travaillais, donc après l'application de cette solution, unfor f in *; do mv "$f" "$f.ext"; done
rapide band-aid® pour obtenir l'extension de votre choix en arrière sur les fichiers que je travaillais avec.Il n'est pas pur bash, mais beaucoup plus facile avec le
rename
commande:J'ai eu un cas plus complexe où les noms de fichier avait un postfix ainsi que d'un préfixe. J'ai également nécessaire d'effectuer une soustraction sur le nombre de nom de fichier.
Par exemple, je voulais
foo56.png
pour devenirfoo00000055.png
.J'espère que cette aide si vous êtes en train de faire quelque chose de plus complexe.
La oneline de commande que j'utilise est: est-ce
MOTIF peut être par exemple:
%04d.${f#*.}
(maintenir l'extension du fichier original)photo_%04d.${f#*.}
(garder l'original extension)%04d.jpg
photo_$(basename $f .${f#*.})_%04d.${f#*.}
Vous pouvez filtrer les fichiers à renommer avec par exemple
ls *.jpg | ...
Vous avez à disposition la variable
f
qui est le nom de fichier eti
qui est le comptoir.Pour votre question, le droit de la commande est:
Pur Bash, pas de processus externe, autre que 'mv':
La suite va le faire:
EDIT: changé à utiliser ((i=1,...)), grâce mweerden!
print -v var
va stocker le résultat dansvar
variable.Voici une solution rapide qui suppose un préfixe de longueur fixe (votre "foo") et de longueur fixe de rembourrage. Si vous avez besoin de plus de souplesse, peut-être que ce sera au moins un point de départ utile.
Ma solution remplace les nombres, partout dans une chaîne
Vous pouvez facilement essayer, car il imprime juste transformé les noms de fichiers (pas de système de fichiers sont les opérations réalisées).
Explication:
En parcourant la liste des fichiers
Une boucle:
for f in * ; do ;done
, répertorie tous les fichiers et passe chaque nom de fichier comme$f
variable de corps de boucle.En saisissant le numéro de chaîne
Avec
echo $f | sed
nous pipe variable$f
àsed
programme.Dans la commande
sed 's/[^0-9]*//g'
, partie[^0-9]*
avec le modificateur^
dit pour correspondre à l'opposé de chiffres de 0 à 9 (pas un nombre) et retirez-la ensuite avec vide de remplacement//
. Pourquoi ne pas simplement supprimer[a-z]
? Parce que le nom de fichier peut contenir des points, des tirets, etc. Donc, nous dépouiller de tout, qui n'est pas un nombre et un nombre.Ensuite, nous avons affecter le résultat de
number
variable. Rappelez-vous de ne pas mettre des espaces dans l'affectation, commenumber = …
, parce que vous obtenez un comportement différent.Nous affecter résultat de l'exécution d'une commande à une variable, emballage de la commande avec backtick de symboles.
Zéro de remplissage
Commande
printf "%04d" $number
les changements de format d'un nombre à 4 chiffres et ajoute des zéros si notre numéro contient moins de 4 chiffres.De remplacer nombre de zéros nombre
Nous utilisons
sed
à nouveau avec remplacement de la commande commes/substring/replacement/
. Pour interpréter nos variables, nous utilisons des guillemets, et remplacer les variables de cette manière${number}
.Le script ci-dessus imprime juste transformé noms, alors, faisons-le réel de renommage de l'emploi:
Espère que cela aide quelqu'un.
J'ai passé plusieurs heures à le comprendre.
À gauche de la tablette nombres dans les noms de fichiers:
Explication
`echo ... $2}\`
(La barre oblique inverse \, immédiatement au-dessus de juste divisions one-liner, sur deux lignes, pour des raisons de lisibilité)[0-9]*.[a-z]*
$f
) pour passer àawk
-F.
:awk
séparateur de champ, une période (.
): si appariés, sépare les noms de fichiers sous forme de deux champs ($1
= nombre;$2
= extension)printf
: imprimer le premier champ ($1
, le numéro de la partie) que 4 chiffres (%04d
), puis imprimez la période, puis imprimez-le deuxième champ ($2
: l'extension) comme une chaîne de caractères (%s
). Tout cela est attribué à la$tmp
variable$f
) pour le nouveau nom de fichier ($tmp
)