Question

J'ai eu à l'origine un ensemble d'images de la forme image_001.jpg, image_002.jpg, ...

Je suis passé par eux et enlevé plusieurs. Maintenant, je voudrais renommer les fichiers restants Retour à image_001.jpg, image_002.jpg, ...

Y at-il une commande Linux qui va le faire d'une manière ordonnée? Je connais renommage mais ne vois rien à l'ordre des noms de fichiers comme celui-ci. Je pense que depuis ls *.jpg répertorie les fichiers dans l'ordre (avec des lacunes), la solution serait de passer la sortie de ce dans une boucle bash ou quelque chose?

Était-ce utile?

La solution

Si je comprends bien, vous avez par exemple image_001.jpg, image_003.jpg, image_005.jpg, et que vous souhaitez renommer image_001.jpg, image_002.jpg, image_003.jpg.

EDIT: Ceci est modifié pour mettre le fichier temporaire dans le répertoire courant. Comme Stephan202 a noté, cela peut faire une différence significative si la température est sur un autre système de fichiers. Pour éviter de heurter le fichier temporaire dans la boucle, il passe maintenant par l'image *

i=1; temp=$(mktemp -p .); for file in image*
do
mv "$file" $temp;
mv $temp $(printf "image_%0.3d.jpg" $i)
i=$((i + 1))
done                                      

Autres conseils

Une simple boucle (test avec echo, exécuter avec mv):

I=1
for F in *; do
  echo "$F" `printf image_%03d.jpg $I`
  #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true
  I=$((I + 1))
done

(j'ai ajouté 2>/dev/null || true pour supprimer les avertissements sur la source et les fichiers identiques cibles. Si ce n'est pas à votre goût, allez avec Matthieu l ' flaschen ).

Essayez le script suivant:

numerate.sh

Ce code snipped devrait faire le travail:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r

fait l'inverse de ce que vous demandez (en prenant des fichiers de la forme * .jpg.001 et les convertir en * .001.jpg), mais peut facilement être modifié à votre objectif:

for file in * 

do

if [[ "$file" =~ "(.*)\.([[:alpha:]]+)\.([[:digit:]]{3,})$" ]]

then

mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"

fi

done

Quelques bonnes réponses déjà là; mais certains se fondent sur des erreurs cache qui n'est pas une bonne idée (qui suppose mv sera seule erreur en raison d'une condition qui devrait - ce sur tous les autres reaons mv pourrait l'erreur).

En outre, il peut être fait un peu plus courte et devrait être mieux cité:

for file in *; do
    printf -vsequenceImage 'image_%03d.jpg' "$((++i))"
    [[ -e $sequenceImage ]] || \
        mv "$file" "$sequenceImage"
done

Notez également que vous ne devriez pas capitaliser vos variables dans les scripts bash.

J'allais dire quelque chose comme ci-dessus en utilisant une boucle, un itérateur, coupé -f1 « _ » -d, puis mv i i.iterator. On dirait qu'il est déjà couvert d'autres moyens, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top