Renommer en masse, changer le préfixe

53

Comment puis-je remplacer en bloc le préfixe de nombreux fichiers?

J'ai beaucoup de fichiers comme

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Je voudrais changer tous en

  • CLConnectionContext.h
  • CLConnectionContext.m

Comment je ferais ça?

ErikTJ
la source

Réponses:

38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

Cette méthode utilise la substitution de commande bash pour supprimer les 6 premiers caractères du nom de fichier en entrée cut, est ajoutée CLau résultat et stockée dans $newname. Ensuite, il renomme l'ancien nom en le nouveau. Ceci est effectué sur chaque fichier.

cut -c7-spécifie que seuls les caractères après l'index 7 doivent être renvoyés à partir de l'entrée. 7-est une plage commençant à l'indice 7 sans fin; c'est-à-dire jusqu'à la fin de la ligne.

Auparavant, j'avais déjà utilisé cut -b7-mais je devais -cplutôt utiliser pour gérer des codages de caractères pouvant comporter plusieurs octets par caractère, comme UTF-8.

mrb
la source
Thx, je l'ai aussi maintenant. Marquer comme réponse. Thx
ErikTJ
Cela fonctionne bien, merci. Pouvez-vous expliquer ce que fait le -b7? Est-ce que cette référence à la liste d'octets? ss64.com/bash/cut.html
imjared le
@imjared Mise à jour de la réponse avec plus de détails.
mrb
56

Je dirais que le plus simple renameconsiste simplement à utiliser la commande qui est commune à de nombreuses distributions Linux. Il existe deux versions courantes de cette commande. Consultez sa page de manuel pour trouver celle que vous avez:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

Si vous voulez utiliser la version de util-linux-ng dans un système Debian, elle est disponible sous le nom rename.ul

carandraug
la source
7
Une mise en garde: plusieurs versions de renameexistent dans la nature. Consultez votre renamedocumentation locale pour savoir comment utiliser la vôtre.
Jw013
Pour supprimer le pseudo dorename TestSR '' *
Bsienn le
hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder
33

L’extension des paramètres du shell suffit pour des transformations simples comme celle-ci. La substitution de commande est moins efficace en raison de la nécessité de générer des processus supplémentaires (pour la substitution de commande elle-même et le cut/ sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
jw013
la source
Explication: TestSR*trouve les fichiers, CL${f#TestSR}sera le nouveau nom. Le contenu après le #sera remplacé par le nom de fichier ( f).
Joe Eifert
4

Voici un moyen:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> Trouver tous les fichiers avec l'extension .h ou .m
  • n=CL -> Ajouter un préfixe CL au nom du fichier
  • sed -e 's/^Test//' -> Supprime le préfixe Test du nom de fichier
  • mv $a $n -> Effectue le changement de nom
Eric
la source
3

Vous pouvez essayer avec:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Voir man bash(section "Extension des paramètres") pour plus de détails.

Francesco Turco
la source
1

Eh bien, ce n’était pas aussi difficile que moi.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
ErikTJ
la source
1
Si cela vous aide pour l'avenir, vous n'avez pas à répéter les commandes pour vos deux modèles. vous pouvez utiliser (par exemple): for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb
1

Si vous avez besoin de quelque chose de plus perlish, vous pouvez le faire

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
utilisateur1146332
la source