ファイル名に科学的表記法で書かれた数字の変更

ファイル名に科学的表記法で書かれた数字の変更

画像ファイルで画像を作成していますが、ファイル名に科学的表記法による数字が含まれているため、名前の順序が正しくありません。

ファイル名の形式は次のとおりです。

ABC_1.000000E-01.png ~ ABC_1.100000E+01.png,
DEF_1.000000E-01.png ~ DEF_1.100000E+01.png,
GHI_1.000000E-01.png ~ GHI_1.100000E+01.png,
.
.
.

数値が使用する数値表現を変更すると、順序がもはや合わなくなるので、次のように変更したいと思います。

ABC_001.png ~ ABC_110.png,
DEF_001.png ~ DEF_110.png,
GHI_001.png ~ GHI_110.png,
.
.
.

私のLinuxシステムでこれをどのように実行しますか?

答え1

また試み

ls -1 *.png | LC_ALL=C awk -F[._] '{TMP=$2 "." $3; printf "mv %s  %s_%03d.%s\n", $0, $1, 10*TMP, $4}'                  
mv ABC_1.000000E-01.png  ABC_001.png
mv ABC_1.100000E+01.png  ABC_110.png
mv DEF_1.000000E-01.png  DEF_001.png
mv DEF_1.100000E+01.png  DEF_110.png
mv GHI_1.000000E-01.png  GHI_001.png
mv GHI_1.100000E+01.png  GHI_110.png

awk科学的表記法で数値を分離して変換し、10倍の値をゼロパディングされた整数として出力するために使用されます。たとえば、sh結果に満足している場合は、パイプラインを通過してみてください。

答え2

以下は、現在のディレクトリですべてのpngファイルを見つけ、それに応じて名前を変更するスクリプトです。既存のファイルを上書きしません。


作品のプレビューです。

./DEF_1.100000E+01.png - ./DEF_11.00.png
./DEF_1.000000E-01.png - ./DEF_0.10.png
./GHI_1.000000E-01.png - ./GHI_0.10.png
./ABC_1.100000E+01.png - ./ABC_11.00.png
./GHI_1.100000E+01.png - ./GHI_11.00.png
./ABC_1.000000E-01.png - ./ABC_0.10.png

スクリプトの移行

$ ls
ABC_1.000000E-01.png  DEF_1.000000E-01.png  GHI_1.000000E-01.png  script.sh
ABC_1.100000E+01.png  DEF_1.100000E+01.png  GHI_1.100000E+01.png

スクリプトの後

$ ls
ABC_0.10.png   DEF_0.10.png   GHI_0.10.png   script.sh
ABC_11.00.png  DEF_11.00.png  GHI_11.00.png

スクリプト

#!/bin/bash

for file in $(find . -type f -name "*.png")
do
    number=$(echo "${file}" | cut -d'_' -f 2)
    number=$(basename "${number}" .png)
    number=$(echo "${number}" | awk '{ printf("%.2f\n",$1) }')

    filename=$(echo "${file}" | cut -d'_' -f 1)

    mv -n "${file}" "${filename}_${number}.png"
done

答え3

そしてzsh

$ autoload -Uz zmv
$ zmv -n '(*_)(<->.<->E[+-]<->)(.png)' '$1${(l[3][0])$(( ($2*10)|0 ))}$3'
mv -- ABC_1.000000E-01.png ABC_001.png
mv -- ABC_1.100000E+01.png ABC_110.png
mv -- DEF_1.000000E-01.png DEF_001.png
mv -- DEF_1.100000E+01.png DEF_110.png
mv -- GHI_1.000000E-01.png GHI_001.png
mv -- GHI_1.100000E+01.png GHI_110.png

-n必要に応じてテストを実行するために削除できます。)

perl- ベースのバリエーションに似ていますrename(時には(関連していない、より制限的な)コマンドと区別するためにprenameorとも呼ばれます):perl-renamerenameutil-linux

$ rename -n 's{_\K\d+\.\d+E[+-]\d+(?=\.png\Z)}{sprintf "%03d", $&*10}e' ./*.png
rename(./ABC_1.000000E-01.png, ./ABC_001.png)
rename(./ABC_1.100000E+01.png, ./ABC_110.png)
rename(./DEF_1.000000E-01.png, ./DEF_001.png)
rename(./DEF_1.100000E+01.png, ./DEF_110.png)
rename(./GHI_1.000000E-01.png, ./GHI_001.png)
rename(./GHI_1.100000E+01.png, ./GHI_110.png)

2つの間の類似点:

  • perlは\d+1つ以上の10進数と一致しますが、zshは<->任意の10進数を表す文字列(無制限の形式<x-y>)と一致するため、本質的に同じです。
  • sprintf "%03d"整数に変換してゼロで埋めます。 zshから$(( number|0 ))整数とパッドに変換します。l[3][0]

違い:

  • zmv名前の変更が完了する前に、完全性チェックが実行されます(たとえば、既存のターゲットx_1E+2.pngファイルとの競合または既存のターゲットファイルとの競合)。x_10E+1.png
  • zshのlパラメータ拡張フラグはパディングされますが、指定された幅に切り捨てられます。したがって、(1200)はに1.2E+3切り捨てられて残ります。200sprintf "%03d"1200

関連情報