ISS45_20200302030042.zip
R0387F200229.zip
我想要一个适合这种情况的 shell 脚本。上面是两个文件名,我想要这样的东西。我希望将数字部分添加到这两个文件名的前面。请参阅下面的示例了解我想要的内容:
20200302030042_ISS45_20200302030042.zip
200229_R0387F200229.zip
for f in *.zip; do
mv "$f" $(sed -E 's/^(.+)_([^.]+)\./\2_\1./' <<< "$f")
done
我正在用这个。它仅适用于iss45
文件,但不适用于R
文件。
答案1
这是sed
您需要的命令:
sed -r 's/^(.*)([^[:digit:]])([[:digit:]]+)\.zip$/\3_\1\2\3.zip/'
$ echo ISS45_20200302030042.zip |
sed -r 's/^(.*)([^[:digit:]])([[:digit:]]+)\.zip$/\3_\1\2\3.zip/'
20200302030042_ISS45_20200302030042.zip
$ echo R0387F200229.zip |
sed --posix -r 's/^(.*)([^[:digit:]])([[:digit:]]+)\.zip$/\3_\1\2\3.zip/'
200229_R0387F200229.zip
答案2
如果您有可用的 Perl-ish 版本的重命名(即使没有,正则表达式也应该与sed -r
.)一起使用。
rename 's/^(.*[^0-9]+)([0-9]+)([.]zip)$/$2_$1$2$3/' *.zip
从逻辑上将名称分为三个部分,从右到左:扩展名$3
、扩展名之前的数字块$2
以及其之前的所有内容$1
。
然后用预先准备好的缝合在一起$2
。