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
filename.ext
en filename.whatever.ext
), 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