Petit pense bête pour les possibilités qu’offre zmv une fonctionnalité de Zsh
Renomer tous les fichiers avec le nom du répertoire en préfix.
$ zmv '(*)/(*.txt)' '${1}_$2'
Renomer une partie d’un fichier, par exemple exemple.1.{txt,conf,db} ou 12345.1.{wav.ogg.mp3} et le 1 en 2 dans le nom de fichier tout en préservant le reste de celui ci.
$ zmv -n '(*.)(<->)(.[^.]#)' '$1$(($2+1))$3' # renommerait x.0001.y en x.2.y
$ zmv -n '(*.0#)(<->)(.[^.]#)' '$1$(($2+1))$3'
Renomer tous les fichiers en minuscule
$ zmv '*' '${(L)f}'
Renuméroter tous les fichiers en série (foo.foo > 1.foo, fnord.foo > 2.foo, ..).
$ autoload zmv
$ ls *
1.c asd.foo bla.foo fnord.foo foo.fnord foo.foo
$ c=1 zmv '*.foo' '$((c++)).foo'
$ ls *
1.c 1.foo 2.foo 3.foo 4.foo foo.fnord
Renomer “file.with.many.dots.txt” avec remplacement de tous les points par un espace sauf le dernier.
$ touch {1..20}-file.with.many.dots.txt
$ zmv '(*.*)(.*)' '${1//./ }$2'
Supprimer les 4 premiers caractères d’un nom de fichier.
$ zmv -n '*' '$f[5,-1]' # NOTE: Le "5" n'est PAS une erreur d'écriture
Renommez les noms de tous les fichiers du répertoire en cours en minuscules, mais conservez les noms des répertoires tels quels.
$ zmv -Qv '(**/)(*)(.D)' '$1${(L)2}'
remplace tout le 4ème caractère, qui est “1”, avec “2” et ainsi de suite.
$ autoload -U zmv
$ zmv '(???)1(???[1-4].txt)' '${1}2${2}'
Supprimer les 15 premiers caractères d’une chaîne.
$ touch 111111111111111{a-z}
$ autoload zmv
$ zmv '*' '$f[16,-1]'
Remplacer les espaces (n’importe quel nombre) par un seul tiret dans les noms de fichiers.
$ autload zmv
$ zmv -n '(**/)(* *)' '$1${2//( #-## #| ##)/-}'
# ou en BASH
$ find . -depth -name '* *' -exec bash -c '
> shopt -s extglob
> file=$1
> dir=${file%/*}
> name=${file##*/}
> newname=${name//*([ -]) *([ -])/-}
> mv -i -- "$file" "$Dir/$newname"' {} {} \;
Nettoyer les noms de fichiers et supprimer les caractères spéciaux.
$ autoload zmv
$ zmv -n '(**/)(*)' '$1${2//[^A-Za-z0-9._]/_}'
Ajoutez * .py à un ensemble de scripts python dans un répertoire (certains d’entre eux se terminent par * .py et leur donnent tous une extension appropriée).
$ autoload zmv
$ zmv -n '(**/)(con*)(#qe,file $REPLY | grep "python script",)' '$1$2.py'
Mettre toutes les extensions en minuscules (i. e. * .JPG) en incluant les sous-dossiers.
$ autoload zmv
$ zmv '(**/)(*).(#i)jpg' '$1$2.jpg'
# ou sans ZSH
$ find Dir -name '*.[jJ][pP][gG]' -print | while read f
> do
> case $f in
> *.jpg) ;
> *) mv "$f" "${f%.*}.jpg" ;
> esac
> done
Supprimer les zéros au début de l’extension de fichier.
$ autoload zmv
$ ls
filename.001 filename.003 filename.005 filename.007 filename.009
filename.002 filename.004 filename.006 filename.008 filename.010
$ zmv '(filename.)0##(?*)' '$1$2'
$ ls
filename.1 filename.10 filename.2 filename.3 filename.4 filename.5 filename.6 ...
Renuméroter les fichiers.
$ autoload zmv
$ ls *
foo_10.jpg foo_2.jpg foo_3.jpg foo_4.jpg foo_5.jpg foo_6.jpg foo_7.jpg foo_8.jpg foo_9.jpg
$ zmv -fQ 'foo_(<0->).jpg(.nOn)' 'foo_$(($1 + 1)).jpg'
$ ls *
foo_10.jpg foo_11.jpg foo_3.jpg foo_4.jpg foo_5.jpg foo_6.jpg foo_7.jpg foo_8.jpg foo_9.jpg
Ajouter des zéros à un nom de fichier (1.jpg -> 001.jpg, ..
$ autoload zmv
$ zmv '(<1->).jpg' '${(l:3::0:)1}.jpg'
Voir ci-dessus, mais maintenant uniquement les fichiers avec un nom de fichier> = 30 caractères.
$ autoload zmv
$ c=1 zmv "${(l:30-4::?:)}*.foo" '$((c++)).foo'
Remplacer tous les esapces dans les noms de fichiers par un tiret bas.
$ autoload zmv
$ zmv '* *' '$f:gs/ /_'
Replacer les extentions de fichier ‘sh’ par ‘pl’
$ autoload zmv
$ zmv -W '*.sh' '*.pl'
Ajouter une extension “.txt” à tous les fichiers de $ {HOME}
# ``-.'' est de ne renommer que les fichiers normaux ou les liens symboliques en fichiers normaux,
# ``D'' est de renommer également les fichiers cachés (dotfiles)
$ autoload zmv
$ zmv -Q '/home/**/*(D-.)' '$f.txt'
# Ou simplement renommer des fichiers sans extension:
$ zmv -Q '/home/**/^?*.*(D-.)' '$f.txt'
Changer récursivement les noms de fichiers avec des caractères ? [ ] / = + < > ; : " , - *
$ autoload zmv
$ chars='[][?=+<>;",*-]'
$ zmv '(**/)(*)' '$1${2//$~chars/%}'
Supprimer des guillemets simples des noms de fichiers (de manière récursive)
$ autoload zmv
$ zmv -Q "(**/)(*'*)(D)" "\$1\${2//'/}"
Quand un nouveau fichier arrive (nommé fichier.txt), renommez tous les fichiers afin d’obtenir (par exemple, fichier119.txt devient fichier120.txt, fichier118.txt devient fichier119.txt, et ainsi de suite, fichier.txt devenant fichier1.txt).
$ autoload zmv
$ zmv -fQ 'fichier([0-9]##).txt(On)' 'fichier$(($1 + 1)).txt'
minuscules / majuscules tous les fichiers / répertoires
$ autoload zmv
$ zmv '(*)' '${(L)1}' # minuscule
$ zmv '(*)' '${(U)1}' # majuscule
Supprimer les extentions ‘c’ pour tout les fichiers.
$ autoload zmv
$ zmv '(*).c' '$1'
Mise en majuscule de la première lettre de tous les fichiers ‘mp3’
$ autoload zmv
$ zmv '([a-z])(*).mp3' '${(C)1}$2.mp3'
Copiez la cible ‘README’ dans le même répertoire que chaque ‘Makefile’
$ autoload zmv
$ zmv -C '(**/)Makefile' '${1}README'
Renommez pic1.jpg, pic2.jpg, .. en pic0001.jpg, pic0002.jpg, ..
$ autoload zmv
$ zmv 'pic(*).jpg' 'pic${(l:4::0:)1}.jpg'
$ zmv '(**/)pic(*).jpg' '$1/pic${(l:4::0:)2}.jpg' # de manière récursive