web-dev-qa-db-fra.com

Renommer des fichiers par lots

J'ai un répertoire plein d'images:

image0001.png
image0002.png
image0003.png
...

Et je voudrais un one-liner pour les renommer (par exemple).

0001.png
0002.png
0003.png
...

Comment puis-je faire cela?

157
Internet man

Si vous utilisez Bash ou un autre shell compatible POSIX:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

Sur Debian et ses dérivés, rename de Perl fonctionne de manière similaire à sed comme ceci:

  rename -v 's/image//' *.png

Il y a aussi le rename de util-linux qui fonctionne comme ceci, à la place:

  rename image '' *.png
113
Internet man

zmv

Le shell zsh possède une puissante commande de renommage par lots appelée zmv.

Vous devez d'abord activer la commande zmv comme suit (cela peut aller dans votre ~/.zshrc).

autoload zmv

La syntaxe de base est zmv PATTERN REPLACEMENT. Le modèle est une expression de glob de Shell. Des parties du motif peuvent être entourées de parenthèses. Le texte de remplacement peut contenir $1, $2, etc. pour faire référence au Nième groupe entre parenthèses dans le motif. Par exemple:

zmv 'image(*.png)' '$1'

Vous pouvez également demander à zsh de définir automatiquement $1, $2, etc. pour faire correspondre les caractères génériques du modèle:

zmv -w 'image*.png' '$1.png'

J'utilise normalement l'utilitaire Nice et simple mmv ( page de manuel ) pour ce cas d'utilisation:

$ mmv "image*.png" "#1.png"

exécutera votre tâche.

Le #1 dans le modèle cible sera remplacé par tout ce qui correspond au caractère générique dans le modèle source. Cela fonctionne également pour plusieurs caractères génériques et peut être utilisé par exemple pour modifier l'ordre des parties des noms de fichiers. Vous pouvez également facilement faire des choses plus compliquées comme convertir des minuscules en majuscules.

Assurez-vous de protéger les motifs du Shell en citant.

34
Marcel Stimberg

POSIX sh pour boucle

tilise sed pour renommer

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

J'aime Perl donc:

Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Vous pouvez également utiliser le même modèle pour d'autres tâches telles que la copie des fichiers dans un autre répertoire:

Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
6
gvkv

qmv

La commande qmv de renameutils ouvre un éditeur affichant une liste de noms de fichiers avec deux colonnes, séparés par un onglet. Chaque ligne affiche l'un des noms de fichiers, le même dans les deux colonnes. La colonne de droite représente les nouveaux noms des fichiers.
Pour apporter des modifications, modifiez les noms sur le côté droit. Dans cet exemple, :%s/... ou le mode de blocage visuel sont utiles.

Noms de fichiers dans votre éditeur

$ qmv *.png

Dans l'éditeur:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Modifiez les noms dans la colonne de droite:
(Suppression du préfixe image de toutes les lignes en utilisant le mode de blocage visuel)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Journal de renommage:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(par exemple Ubuntu: apt-get install renameutils)

6
Volker Siegel

récursif

recurse facile sélectionnant les fichiers image * png, et suppose qu'il n'est pas nécessaire de traiter la nouvelle ligne dans les noms de fichiers

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

sûr, peut gérer les espaces, les nouvelles lignes, les barres obliques inverses et tout le reste:

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done
3
X Tian

Utilisation de Expansion de l'accolade shell :

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

Essayez brename ( https://github.com/shenwei356/brename ), un outil de ligne de commande multiplateforme pratique pour renommer par lots en toute sécurité des fichiers/répertoires via une expression régulière (prenant en charge Windows, Linux et OS X ).

@ patrickDurusa a dit:

Linux a une variété d'options de changement de nom de fichier batch, mais je n'ai vu aucun défaut dans le nom de fichier qui m'a sauté aux yeux.

Fonctionnalités:

  • Multiplateforme . Prise en charge de Windows, Mac OS X et Linux.
  • Coffre-fort . Par vérification des conflits et erreurs potentiels.
  • Filtrage de fichiers . Prise en charge de l'inclusion et de l'exclusion de fichiers via une expression régulière. Pas besoin d'exécuter des commandes comme find ./ -name "*.html" -exec CMD.
  • Renommage du sous-match avec la valeur correspondante via le fichier de valeurs-clés .
  • Renommage via un entier croissant .
  • Renommer récursivement à la fois les fichiers et les répertoires .
  • Prise en charge du fonctionnement à sec .
  • Sortie colorée .

Commander:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
1
Wei Shen

POSIX sh utilisant une boucle while

Lecture des noms de la commande find.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Lecture des noms d'un fichier

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
1
X Tian

Pour Windows et linux , cela script Perl fera l'affaire; dans ce cas:

$ rnm -l 's/^image//' '*.png'

Le script pourrait s'exécuter récursivement sous les répertoires et même ajouter un décompte à chacun d'eux:

$ rnm -r 's/^/$counter./' '/\.png$/'

Les caractères UTF-8 sont également correctement traités, à la fois sous Windows et Linux.

1
circulosmeos

Vous pouvez utiliser cet outil: rnm ( page web )

Pour votre cas, la commande serait:

rnm -rs '/^image//' *.png

Vous pouvez trouver plus d'exemples/documents ici .

0
Jahid