Manydev blog

Utilisation De Zmv

- ~4 min(s) de lecture

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