/ / Shell comando para dar formato a los números dentro de los nombres de archivo - bash, shell

Comando de shell para dar formato a los números dentro de los nombres de archivo - bash, shell

Tengo una carpeta que contiene los siguientes archivos:

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

Y me gustaría cambiarles el nombre formando números con 4 dígitos

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

¿Cómo puedo lograr eso con un comando bash shell?

Respuestas

6 para la respuesta № 1

Un puro bash solución:

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

Una expresión regular extrae el número para rellenar y lo almacena en el BASH_REMATCH formación. Entonces printf se utiliza para crear el nuevo nombre de archivo, con el número reinsertado y rellenado con ceros.


2 para la respuesta № 2

truco sucio pero trabajando

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

2 para la respuesta № 3

Puedes usar printf"s opciones en awk para imprimir cuatro dígitos:

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

Así podría ser:

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

Esto usa awk con ambos separadores de campo: bien . o -. Luego, toma el tercer bloque basado en ellos y formatea su valor con el %04i bandera (casi equivalente a %d como se vio en La Guía del usuario de GNU Awk # 5.5.2 Cartas de control de formato)


1 para la respuesta № 4

En primer lugar, asumo que no hay espacios en su nombre de archivo. entonces

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

imprimirá el mv ... mando. para ejecutarlos, solo canaliza la salida a sh me gusta

ls...|awk ..|sh

el núcleo es la parte awk, pruébalo un poco:

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