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ť printf
Vo 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