J'ai des charges de fichiers qui ressemblent à ceci:
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
et je veux qu'ils ressemblent à ceci:
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
Comment puis-je faire ceci?
Il existe plusieurs variantes d’une commande de changement de nom. Dans votre cas, elle peut être aussi simple que
rename ABC XYZ *.dat
Vous pouvez avoir une version qui prend une expression rationnelle Perl;
rename 's/ABC/XYZ/' *.dat
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
Pas besoin de rename
ou sed
. Juste bash expansion des paramètres .
Quelque chose comme ça va le faire. La boucle for
devra peut-être être modifiée en fonction des noms de fichiers que vous souhaitez capturer.
for fspec1 in DET01-ABC-5_50-*.dat ; do
fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
mv ${fspec1} ${fspec2}
done
Vous devriez toujours tester ces scripts sur copies de vos données, soit dit en passant, et dans des répertoires totalement différents.
Vous devrez apprendre à utiliser sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed
Et aussi à utiliser pour que vous puissiez parcourir vos entrées de fichier http://www.cyberciti.biz/faq/bash-for-loop/
Votre commande ressemblera à quelque chose comme ça, je n'ai pas de terme à côté de moi donc je ne peux pas vérifier
for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
Toutes ces réponses sont simples et bonnes. Cependant, j'aime toujours ajouter un mode interactif à ces scripts pour pouvoir détecter les faux positifs.
si [[-n $ inInteractiveMode]]
puis
Echo -e -n "$ oldFileName => $ newFileName\nVoulez-vous effectuer ce changement? [Y/n]:"
Lecture[[-z $ run || "$ run" == "y" || "$ run" == "Y"]] && mv "$ oldFileName" "$ newFileName"
Fi
Ou bien faites du mode interactif le mode par défaut et ajoutez un indicateur de force (-f | --force) pour les scripts automatisés ou si vous vous sentez téméraire. Et cela ne vous ralentit pas trop: la réponse par défaut est "oui, je veux renommer", vous pouvez donc appuyer sur la touche Entrée à chaque invite (à cause de la commande `` -z $ run\
test.
J'aime faire ça avec sed. Dans votre cas:
for x in DET01-*.dat; do
echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/'
done | sh -e
Il est préférable d’omettre d’abord la partie "sh -e" pour voir ce qui sera exécuté.