文件名重命名 - 删除子字符串日期

时间:2017-03-10 03:17:15

标签: bash

我正在尝试将文件名格式为ABCD-YYMMDD-HHMMSS-EFGH的文件列表重命名为ABCD-EFGH。

例如我有以下内容:

Case1-20170309-110213-TOCLOSE Case2-20170416-110314-TOCLOSE Case3-20171112-110715-TOCLOSE

我希望将它们重命名为:

案例1-TOCLOSE 案例2,TOCLOSE 情形3-TOCLOSE

基本上我只是想摆脱文件名中嵌入的日期和时间。由于日期和时间都不同,我能想到的唯一方法是将 - - - 模式重命名为 -

经过研究,我尝试了以下但没有成功:

重命名的/ - * - * - / - /'*

抱歉,因为我在这里完全是bash脚本初学者,所以我真的可以使用一些指导。

谢谢。

安迪

1 个答案:

答案 0 :(得分:0)

使用renameprename):

rename -n 's/^([^-]+-).*-([^-]+$)$/$1$2/' *-*-*-*
  • ^([^-]+-)从开始到第一个-获取部分,并将匹配放入捕获的第1组

  • ([^-]+$)$ gets the portion at end after last - `,并将匹配放入捕获的第2组

  • 在替换中,使用了两个捕获的组,$1$2

-n执行try-run,删除-n进行实际操作。

使用shell参数扩展,获取所需部分:

for f in *-*-*-*; do echo mv -i "$f" "${f%%-*}-${f##*-}"; done
  • ${f%%-*}从第一个-变量f

  • 中删除所有内容
  • ${f##*-}将子字符串删除到最后- 删除echo以进行实际操作。

示例:

% rename -n 's/^([^-]+-).*-([^-]+$)$/$1$2/' *-*-*-*
Case1-20170309-110213-TOCLOSE renamed as Case1-TOCLOSE
Case2-20170416-110314-TOCLOSE renamed as Case2-TOCLOSE
Case3-20171112-110715-TOCLOSE renamed as Case3-TOCLOSE

% for f in *-*-*-*; do echo mv -i "$f" "${f%%-*}-${f##*-}"; done
mv -i Case1-20170309-110213-TOCLOSE Case1-TOCLOSE
mv -i Case2-20170416-110314-TOCLOSE Case2-TOCLOSE
mv -i Case3-20171112-110715-TOCLOSE Case3-TOCLOSE