3

次のファイルを含むフォルダーがあります。

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

そして、数字を4桁でフォーマットして名前を変更したいと思います

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

bash シェル コマンドを使用してそれを実現するにはどうすればよいですか?

4

4 に答える 4

7

純粋なbash解決策:

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

正規表現は、パディングする数値を抽出し、BASH_REMATCH配列に格納します。次にprintf、番号を再挿入してゼロを埋め込んで、新しいファイル名を作成するために使用されます。

于 2013-02-07T13:26:48.543 に答える
2

printfawkでのオプションを使用して4桁を印刷できます。

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

したがって、次のようになります。

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

これは、またはawkの両方のフィールドセパレータで使用します。次に、それらに基づいて3番目のブロックを取得し、その値をフラグでフォーマットします( GNU Awkユーザーガイド#5.5.2フォーマット-コントロールレターに見られるものとほぼ同等です)。.-%04i%d

于 2013-02-07T13:20:54.297 に答える
2

汚いが機能するハック:

for i in $(seq 2345); do
    mv trackingData-00-$i.data trackingData-00-`printf %04d $i`.data;
done
于 2013-02-07T13:24:10.780 に答える
1

まず、ファイル名にスペースが含まれていないと仮定します。それから

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

コマンドを出力しmv ...ます。shそれらを実行するには、出力をlikeにパイプするだけです

ls...|awk ..|sh

コアはawk部分です。少しテストしてください:

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
于 2013-02-07T13:21:58.387 に答える