comment renommer plusieurs fichiers en supprimant un caractère ou une chaîne?

21

Pour faire suite à ma question précédente , si j'ai plusieurs fichiers du formulaire

sw.ras.001
sw.ras.002
sw.ras.003
…

Quelle commande puis-je utiliser pour supprimer le ras.au milieu de tous les fichiers?

Paul
la source
Voulez-vous supprimer uniquement le ras, c'est-à-dire se retrouver avec sw..001, ou le ras., partir sw.001?
Kevin
je voudrais probablement supprimer le «ras». la commande serait-elle très différente?
Paul
Non, juste si vous incluez le \.dans les modèles.
Kevin

Réponses:

35

Vous pouvez le faire avec une assez petite modification de l'une ou l'autre réponse de la dernière question:

rename s/ras\.// sw.ras.*

ou

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Explication:

renameest un perlscript qui prend une perlexpression régulière et une liste de fichiers, applique tour à tour l'expression régulière au nom de chaque fichier et renomme chaque fichier en résultat de l'application de l'expression régulière. Dans notre cas, rascorrespond littéralement et \.correspond à un littéral .(comme .seul indique un caractère autre qu'un retour à la ligne), et il le remplace par rien.

La forboucle prend tous les fichiers commençant par sw.ras.(glob shell standard) et les boucle sur eux. ${var/search/replace}recherches $varpour searchet remplace la première occurrence avec replace, si les ${file/ras./}rendements $fileavec le premier ras.enlevé. La commande renomme ainsi le fichier sous le même nom moins ras.. Notez qu'avec cette recherche et remplacement, .est pris littéralement, pas comme un caractère spécial.

Kevin
la source
Pourriez-vous expliquer votre réponse à d'autres personnes apprenant? Que fait "s / ras \ .// sw.ras. *"? Je suppose que je le sais mais je veux en être sûr, et d'autres peuvent aussi apprendre. Deuxième option de la même manière.
H_7
1
@ H_7 Bonne idée, j'ai ajouté une explication.
Kevin
14

Une autre option consiste à utiliser mmv (Mass MoVe et renommer):

mmv '*ras.*' '#1#2'

N'oubliez pas d'utiliser les guillemets simples autour de vos motifs, sinon les étoiles seront agrandies au niveau de la coque.

L'utilitaire n'est pas toujours disponible mais sinon, vous pouvez l'installer avec:

sudo apt-get install mmv

Voir la page de manuel ici .

alexg
la source
1
C'est un excellent outil !!!
Christian
5

En tout état de shell compatible POSIX ( bash, dash, ksh, etc.):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Ou avec rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Chris Down
la source
1

J'ai récemment dû faire un renommage en masse d'un certain nombre de fichiers où j'ai dû remplacer la dernière occurrence d'un caractère où le caractère s'est produit plusieurs fois dans les noms de fichiers. Dans ce cas particulier, j'ai dû remplacer le dernier tiret -par un trait de soulignement _, en transformant ceci:

some-long-file-name.ext

en cela:

some-long-file_name.ext

Cela a pris du temps, mais cela a finalement réussi:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Ici:

  • ${i%-*} correspond au début du nom de fichier jusqu'à la dernière occurrence du tiret -
  • ${file##*-} correspond au reste du nom de fichier après la dernière occurrence du tiret -
gopherIT
la source