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