Renommez les files dans le dossier local en ajoutant un préfixe ou un suffixe

J'ai beaucoup de files dans un dossier et je veux append un préfixe ou un suffixe (pas les deux ) pour eux. J'ai vérifié ici et découvert que je peux utiliser

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done; 

pour append un préfixe à tous les files se terminant par .jpg (et si je supprime le .jpg , il appenda le préfixe à tous les files du dossier actuel).

Cependant, j'aimerais pouvoir

  • Ajoutez un sufix (c'est-à-dire renommez filename.ext en filename.whatever.ext ),
  • Vérifiez si le préfixe ou le suffixe est déjà présent, puis sautez,
  • Créez un alias qui accepte les arguments tels que addprefix whatever *.ext que addprefix whatever *.ext ou addsufix whatever *.*

Si vous utilisez bash , alors ce one-liner peut le faire pour vous (en supposant que vous ayez les variables $prefix , $suffix et $extension facilement disponibles)

 mv "$filename" "$prefix${filename%.$extension}$suffix.$extension" 

Vous pourriez avoir vos scripts être comme ça

 #!/bin/bash # Usage: addprefix <prefix> <files> prefix=$1 shift for f in "$@" do mv "$f" "$prefix$f" done 

et

 #!/bin/bash # addsuffix <suffix> <files> suffix=$1 shift for f in "$@" do extension=${f##*.} if [ -z $extension ]; then mv "$f" "$f$suffix" else mv "$f" "${f%.$extension}$suffix.$extension" fi done 

Il y a une command rename Perl qui devrait faire l'affaire. Attention cependant: il y a plusieurs commands différentes appelées rename , alors assurez-vous d'avoir le script Perl qui attend un perlexpr comme argument. C'est la command rename fournie par le packageage perl sur Debian et dérivés (Ubuntu, Mint, …), mais pas sur d'autres dissortingbutions qui peuvent avoir un utilitaire différent appelé rename .

 martin@martin ~/test % touch a.txt martin@martin ~/test % touch b.txt martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt martin@martin ~/test % ll insgesamt 0 -rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt -rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt martin@martin ~/test % ll insgesamt 0 -rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt -rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt 

Comme vous pouvez le voir, c'est idempotent – il ne rappenda pas le préfixe quand vous l'appellerez plusieurs fois.

Il fonctionne en remplaçant le début (zéro) des strings ( ^ ) ou le début suivi d'une string de prefix optionnelle avec prefix .

Je vais encapsuler cela dans un script shell ou une fonction shell comme un exercice pour vous 🙂

Postfix est un peu plus difficile, car il faut savoir quelle partie du nom de file constitue l'extension …

Avec zsh :

 autoload zmv # in ~/.zshrc zmv '(*~*suffix).ext' '${1}suffix.ext' 

~ est l'opérateur globbing qui signifie sauf dans zsh .

Exemple simple pour changer le préfixe et l'extension de toutes les images dans le dossier actuel.

 prefix=EG_ extension=.jpg for i in $(ls); do mv $i "$prefix${i%.JPG}$extension"; done 

Si vous voulez vérifier comment cela affecterait vos données avant de le changer, remplacez le mv par echo

La sortie pour IMG_7993.JPG est EG_IMG_7993.jpg