将文件名的最后一个数字部分复制到开头

将文件名的最后一个数字部分复制到开头
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

相关内容