Renommer une partie d'un nom de fichier [dupliquer]

cette question a déjà une réponse ici:

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 faire cette?

72
demandé sur Benjamin W. 2009-09-08 12:45:20

6 réponses

il y a quelques variantes d'une commande Renommer, dans votre cas, elle peut être aussi simple que

rename ABC XYZ *.dat

vous pouvez avoir une version qui prend un Perl regex;

rename 's/ABC/XYZ/' *.dat
134
répondu Paul Dixon 2009-09-08 08:56:56
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

Non rename ou sed nécessaires. Juste bash paramètre d'extension .

88
répondu RJ Alten 2013-07-22 13:44:23

quelque chose comme ça fera l'affaire. La boucle for peut devoir ê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.

6
répondu paxdiablo 2009-09-08 08:57:33

vous aurez besoin d'apprendre à utiliser sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

et aussi à utiliser pour que vous puissiez boucler 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
répondu Leftium 2015-06-22 07:28:40

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 ""151900920"" "DET01-XYZ-.dat"/'
done | sh -e

il est préférable d'omettre la partie" sh-e " d'abord pour voir ce qui sera exécuté.

1
répondu stribika 2009-09-08 08:54:46

Toutes ces réponses sont simples et bons. Cependant, j'aime toujours ajouter un mode interactif pour ces scripts afin que je puisse trouver des faux positifs.

si [[- n $inInteractiveMode ]]

puis

  echo-e -n "$paramètreancien_nom_fichier => $newFileName\nvoulez-vous faire ce changement? [O / n]: "

  lire run

[[ -z $exécuter || "$exécuter" == "y" || "$exécuter" == "Y" ]] && mv "$paramètreancien_nom_fichier" "$newFileName"

fi

ou faites du mode interactif le mode par défaut et ajoutez un drapeau de force (-F | --force) pour les scripts automatisés ou si vous vous sentez audacieux. Et cela ne vous ralentit pas trop: la réponse par défaut est "oui, je veux renommer" donc vous pouvez simplement appuyer sur la touche Entrée à chaque invite (à cause du test `-z $run \ ).

1
répondu Sam Bisbee 2009-09-09 05:15:23