J'ai un répertoire qui contient des fichiers image avec des noms comme
image1.jpg
image2.jpg
image3.jpg
...
Malheureusement, les noms d'images doivent être basés sur zéro, donc image1.jpg
devraient l'être image0.jpg
, image2.jpg
devraient l'être image1.jpg
et ainsi de suite.
Je peux écrire un script pour générer des commandes mv comme celles-ci, les mettre dans un script shell, puis les exécuter -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Mais je suppose qu'il existe une façon plus nette de le faire sous Unix. Alors c'est quoi?
command-line
rename
Nous s
la source
la source
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
àimage0.jpg
et vous avez terminé.Réponses:
Le bon vieux perl renommé:
[Remarques]
Le nombre d'images doit être supérieur à 0.
Dans le cas où les images sont supérieures à 9 et n'ont pas de 0 en tête, utilisez
$(ls -v1 *)
pour éviter le clobber. Proposé par @arielf et remarqué par @Graeme.En cas de doute, utilisez également
-v
pour verbeux et-n
sans action.la source
perlreref
0
de sources.*
à la fin par`ls -v1 *`
et vous serez plus en sécurité contre le clobbering. Cela ira du nombre le plus bas au plus élevé.Vous pouvez diriger le généré
mv
commandes versbash
. Vous n'avez donc pas à les copier dans un script et à les exécuter. Voir:Et tout sera exécuté qui est canalisé
bash
.la source
:)
Résout le problème, alors +1.Vous pouvez parcourir la sortie ls, celle-ci fonctionne pour votre exemple:
Vous devez être sur le même chemin que vos fichiers
la source
-i
ou-n
avecmv
, il empêchera l'écrasement dans les cas marginaux.sort -V
mieux à la place?sort
ne fonctionnera pas, il montreraimage10.jpg
avantimage1.jpg
ce qui pourrait être un problème. Vous avez besoinsort -nk 1.8
comme dans la réponse de @ Graeme.sort -V
est une bonne idée, l'ajoutera à ma réponse. Cependant, il pourrait y avoir d'autres cas marginaux, juste de bons conseils pour ajouter ce type d'options avec des questions comme celle-ci au cas où quelqu'un copierait et finirait par faire des dégâts.Ce qui suit semble fonctionner pour tout ce qui correspond au modèle
imageNUMBER.jpg
. J'ai placéecho
avant lamv
commande pour montrer d'abord ce que la commande ferait; pour effectuer le changement de nom, supprimez simplementecho
Dans la première ligne, le
ls image*.jpg|sort -V
fera apparaître les fichiers JPG avec des nombres ascendants dans le nom de fichier. Lax=
ligne extrait le numéro du nom de fichier. Lay=
ligne décrémente ensuite le nombre de un. Le nom de fichier d'entrée et ley
numéro sont ensuite utilisés dans lamv
commande, où le-i
indicateur vous avertira avant d'écraser un fichier.Pour mon propre petit test, cela a produit la sortie:
Personnellement, je suggère de renommer un nom de fichier plus différent, car maintenant l'ordre dans lequel les fichiers sont traités peut faire une grande différence.
la source
-i
ou-n
avecmv
, il empêchera l'écrasement dans les cas marginaux.sort -n
, l'-V
option n'existe pas.L'utilisation du
perl
scriptprename
, dont le lien symbolique permet de renommer les distributions basées sur Debian, nécessite également GNUfind
/sort
. Les fichiers sont classés par ordre croissant pour éviter tout écrasement.Retirez-le
-n
une fois que vous êtes sûr qu'il fait ce que vous voulez. Avertira des fichiers déjà existants avant de le faire. Cependant, tant qu'il affiche les fichiers renommés dans l'ordre croissant, il n'y aura pas de conflits lorsqu'ils seront exécutés pour de vrai.la source
Avec
zsh
:(retirer
-n
quand heureux).(n)
consiste à trier la liste numériquement afin qu'elleimage9.jpg
soit renommée auparavantimage10.jpg
.la source