我正在尝试将文件名格式为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脚本初学者,所以我真的可以使用一些指导。
谢谢。
安迪
答案 0 :(得分:0)
使用rename
(prename
):
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