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

12

J'ai de nombreux fichiers dans un dossier et je veux leur ajouter soit un préfixe, soit un suffixe (pas les deux ). J'ai vérifié ici et découvert que je peux utiliser

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

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

Cependant, j'aimerais pouvoir

  • Ajouter un sufix (qui est, renommer filename.extà filename.whatever.ext),
  • Vérifiez si le préfixe ou le suffixe est déjà présent, puis ignorez,
  • Créez un alias qui accepte des arguments tels que addprefix whatever *.extouaddsufix whatever *.*
Ce gars brésilien
la source

Réponses:

10

Si vous utilisez bash, puis celui-liner peut le faire pour vous ( en supposant que vous avez les variables $prefix, $suffixet $extensionfacilement disponibles)

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

Vous pourriez avoir vos scripts 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
Aaron Okano
la source
C'est presque parfait! Ce serait parfait s'il (1) vérifiait si le préfixe ou le suffixe était déjà présent (puis sauté), et (2) travaillait sur des fichiers sans extension. Désolé de déranger autant ...
Ce type brésilien
Pour (1), vous pouvez (je pense, non testé) ajouter la vérification du préfixe en enveloppant le mv dans un if [ $f == $prefix* ]et vous pouvez changer le suffixe avec if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]les quelques commandes mv dans l'adduffix. Pour (2), cela devrait déjà fonctionner sur des fichiers sans extension, sauf si je suis un horrible programmeur.
Aaron Okano
7

Il y a une commande Perlrename qui devrait faire l'affaire. Attention cependant: il existe plusieurs commandes différentes rename, alors assurez-vous d'avoir le script Perl qui attend a perlexprcomme argument. C'est la renamecommande fournie par le perlpaquet sur Debian et ses dérivés (Ubuntu, Mint,…), mais pas sur d'autres distributions 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, il est idempotent - il n'ajoutera pas de nouveau le préfixe lorsque vous l'appelez plusieurs fois.

Cela fonctionne en remplaçant le début (de longueur nulle) des chaînes ( ^) ou le début suivi d'une prefixchaîne facultative avec prefix.

Je vais laisser encapsuler cela dans un script shell ou une fonction shell comme un exercice pour vous :)

Postfix est un peu plus difficile, car vous devez déterminer quelle partie du nom de fichier constitue l'extension ...

Martin von Wittich
la source
C'est une bonne réponse, mais je cherchais quelque chose de plus universel; pour cette réponse, vous avez besoin de perl et de cette spécificité (ou équivalent) rename. Et je sais que les suffixes sont un peu plus difficiles, ce n'était pas couvert dans la question liée, et je suis un débutant sur linux, bash, script shell, perl et les expressions régulières, donc "un peu plus dur" est assez difficile pour moi ! :)
Ce gars brésilien
4

Avec zsh:

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

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

Stéphane Chazelas
la source
1

Exemple simple pour changer le préfixe et l'extension de toutes les images du 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 les changer, remplacez le mv par echo

la sortie pour IMG_7993.JPG est EG_IMG_7993.jpg

Jinxi
la source