web-dev-qa-db-fra.com

Renommer en masse, changer le préfixe

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

J'ai beaucoup de fichiers comme

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Je voudrais les changer tous en

  • CLConnectionContext.h
  • CLConnectionContext.m

Comment pourrais-je faire ça?

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

Cela utilise la substitution de commande bash pour supprimer les 6 premiers caractères du nom de fichier d'entrée via cut, ajoute CL au résultat et le stocke dans $newname. Ensuite, il renomme l'ancien nom en nouveau nom. Ceci est effectué sur chaque fichier.

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

Auparavant, j'avais utilisé cut -b7-, mais -c devrait être utilisé à la place pour gérer les encodages de caractères pouvant avoir plusieurs octets par caractère, comme UTF-8.

39
mrb

Je dirais que le plus simple est d'utiliser simplement la commande rename qui est courante sur de nombreuses distributions Linux. Il existe deux versions courantes de cette commande, vérifiez 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 souhaitez utiliser la version d'util-linux-ng dans un système Debian, elle est disponible sous le nom rename.ul

59
carandraug

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

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
35
jw013

Voici une façon:

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

Vous pouvez essayer avec:

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

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

3
Francesco Turco

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;
1
ErikTJ

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

Perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
1
user1146332