web-dev-qa-db-fra.com

Renommer une partie d'un nom de fichier

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?

81
not_a_geek

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
154
Paul Dixon
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

Pas besoin de rename ou sed. Juste bash expansion des paramètres .

101
RJ Alten

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.

7
paxdiablo

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'`
4
Stephen Lacy

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.

1
Sam Bisbee

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é.

1
stribika