Comment puis-je remplacer en bloc le préfixe de nombreux fichiers?
J'ai beaucoup de fichiers comme
Je voudrais les changer tous en
Comment pourrais-je faire ça?
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.
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
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
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 .mn=CL
-> Ajouter un préfixe CL au nom de fichiersed -e 's/^Test//'
-> Supprime le préfixe de test du nom de fichiermv $a $n
-> Effectue le changement de nomVous 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.
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;
Si vous avez besoin de quelque chose de plus, vous pouvez le faire
Perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *