/ / Shell pour formater les nombres dans les noms de fichiers - bash, shell

Commande Shell pour formater les nombres dans les noms de fichiers - bash, shell

J'ai un dossier contenant les fichiers suivants:

trackingData-00-1.data, trackingData-00-2.data, ..., trackingData-00-2345.data

Et je voudrais les renommer en formatant des nombres avec 4 chiffres

trackingData-00-0001.data, trackingData-00-0002.data, ..., trackingData-00-2345.data

Comment puis-je atteindre cet objectif avec une commande shell bash?

Réponses:

6 pour la réponse № 1

Un pur bash Solution:

for f in trackingData-00-*.data; do
[[ $f =~ trackingData-00-([0-9]+).data ]]
mv "$f" $(printf "trackingData-00-%04d.data" ${BASH_REMATCH[1]})
done

Une expression régulière extrait le numéro à compléter et le stocke dans le BASH_REMATCH tableau. ensuite printf est utilisé pour créer le nouveau nom de fichier, avec le nombre réinséré et complété avec des zéros.


2 pour la réponse № 2

hack sale mais qui travaille:

for i in $(seq 2345); do
mv trackingData-00-$i.data trackingData-00-`printf %04d $i`.data;
done

2 pour la réponse № 3

Vous pouvez utiliser printf"Options dans awk pour imprimer quatre chiffres:

echo 3 | awk "{printf ("%04i", $1)}"
0003
echo 33 | awk "{printf ("%04i", $1)}"
0033

Donc ça pourrait être:

for file in trackingData*
do
num=$(awk -F[.-] "{printf ("%04i", $3)}" <<< "$file")
mv $file trackingData-00-$num.data
done

Cela utilise awk avec les deux séparateurs de champs: soit . ou -. Ensuite, il prend le 3ème bloc basé sur eux et formate sa valeur avec le %04i flag (presque équivalent à %d comme on le voit dans Guide de l’utilisateur de GNU Awk n ° 5.5.2 Lettres de contrôle de format).


1 pour la réponse № 4

Tout d'abord, je suppose qu'il n'y a pas d'espaces dans votre nom de fichier. puis

ls/find...| awk -F"-|\." "{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-./,".");print "mv "o" "$0}" OFS="-"

imprimera le mv ... commander. pour les exécuter, dirigez simplement la sortie vers sh comme

ls...|awk ..|sh

le noyau est la partie awk, testez-le un peu:

kent$  echo "trackingData-00-1.data
trackingData-00-2.data"|awk -F"-|\." "{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-./,".");print "mv "o" "$0}" OFS="-"
mv trackingData-00-1.data trackingData-00-0001.data
mv trackingData-00-2.data trackingData-00-0002.data