Renommer une partie d'un nom de fichier [dupliquer]
cette question a déjà une réponse ici:
- renommer plusieurs fichiers sous Unix 20 réponses
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?
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
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
Non rename
ou sed
nécessaires. Juste bash paramètre d'extension .
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.
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'`
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é.
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 \
).