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?
Si vous utilisez Bash ou un autre shell compatible POSIX:
for f in *.png; do
mv -- "$f" "${f#image}"
done
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
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.
tilise sed pour renommer
for i in image*jpg
do
mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
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 $_)'
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.
$ 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
)
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
Utilisation de Expansion de l'accolade shell :
for N in {0001..1000}; do mv "{image,}$N.png"; done
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:
find ./ -name "*.html" -exec CMD
.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
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
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.