/ / Príkaz Shell na formátovanie čísel vo vnútri súborov - bash, shell

Shell príkaz na formát čísla vnútri súborov - bash, shell

Mám priečinok obsahujúci tieto súbory:

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

A chcel by som ich premenovať formátovaním čísel so 4 číslicami

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

Ako to môžem dosiahnuť príkazom bash shell?

odpovede:

6 pre odpoveď č. 1

Čisté bash Riešenie:

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

Regulárny výraz extrahuje číslo na vloženie a uloží ho do BASH_REMATCH array. potom printf sa používa na vytvorenie nového názvu súboru s číslom znovu vloženým a vyplneným nulami.


2 pre odpoveď č. 2

špinavý, ale pracujúci hack:

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

2 pre odpoveď č. 3

Môžeš použiť printfVo voľbe awk môžete vytlačiť štyri číslice:

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

Môže to teda byť:

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

Toto používa awk s oboma oddeľovačmi polí: buď . alebo -, Potom ich berie tretí blok a naformátuje ich hodnotu pomocou %04i vlajka (takmer ekvivalentná %d ako vidíte Príručka používateľa GNU Awk # 5.5.2 Dopisy o riadení formátu).


1 pre odpoveď č. 4

v prvom rade predpokladám, že v názve súboru nie sú medzery. potom

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

vytlačí mv ... Príkaz. na ich vykonanie stačí vložiť výstup do sh Páči sa mi to

ls...|awk ..|sh

jadro je awk časť, trochu to vyskúšajte:

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