/ / Comando Shell per formattare i numeri all'interno dei nomi di file - bash, shell

Comando Shell per formattare numeri all'interno di nomi di file - bash, shell

Ho una cartella contenente i seguenti file:

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

E mi piacerebbe rinominarli formattando numeri a 4 cifre

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

Come posso ottenerlo con un comando bash shell?

risposte:

6 per risposta № 1

Un puro bash soluzione:

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

Un'espressione regolare estrae il numero da riempire e lo memorizza nel BASH_REMATCH array. Poi printf è usato per creare il nuovo nome del file, con il numero reinserito e riempito di zeri.


2 per risposta № 2

hack sporco ma funzionante:

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

2 per risposta № 3

Puoi usare printfLe opzioni di s in awk per stampare quattro cifre:

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

Quindi potrebbe essere:

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

Questo usa awk con entrambi i separatori di campo: entrambi . o -. Quindi, prende il terzo blocco in base a loro e ne formatta il valore con il %04i bandiera (quasi equivalente a %d come visto in GNU Awk Guida per l'utente # 5.5.2 Lettere di controllo formato).


1 per risposta № 4

prima di tutto, presumo che non ci siano spazi nel nome del tuo file. poi

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

stamperà il mv ... comando. per eseguirli, basta inviare l'output a sh piace

ls...|awk ..|sh

il nucleo è la parte di awk, provalo un po ':

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