105 votes

Renommer une partie d'un nom de fichier

J'ai beaucoup de fichiers qui ressemblent à ceci :

DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat

et je veux qu'ils ressemblent à ça :

DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat

Comment puis-je le faire ?

188voto

Paul Dixon Points 122033

Il existe plusieurs variantes d'une commande de renommage. Dans votre cas, il peut s'agir d'une commande simple comme

rename ABC XYZ *.dat

Vous avez peut-être une version qui prend une regex Perl ;

rename 's/ABC/XYZ/' *.dat

142voto

RJ Alten Points 131
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

Non rename o sed nécessaire. Il suffit de bash expansion des paramètres .

9voto

paxdiablo Points 341644

Quelque chose comme ceci fera l'affaire. Le site 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 devez toujours tester ces scripts sur copies de vos données, d'ailleurs, et dans des répertoires totalement différents.

4voto

Vous devrez apprendre à utiliser sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

Et aussi à utiliser pour que vous puissiez parcourir en boucle les entrées de votre fichier. http://www.cyberciti.biz/faq/bash-for-loop/

Votre commande ressemblera à ceci, 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'`

1voto

stribika Points 1907

J'aime faire ça avec sed. Dans ton 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 la partie "sh -e" pour voir ce qui sera exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X