画像ファイルで画像を作成していますが、ファイル名に科学的表記法による数字が含まれているため、名前の順序が正しくありません。
ファイル名の形式は次のとおりです。
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
(時には(関連していない、より制限的な)コマンドと区別するためにprename
orとも呼ばれます):perl-rename
rename
util-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
切り捨てられて残ります。200
sprintf "%03d"
1200