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

Bash 文件名重命名-子字符串日期删除,bash,Bash,我正在尝试将文件名格式为ABCD-YYMMDD-HHMMSS-EFGH的文件列表重命名为ABCD-EFGH 例如,我有以下几点: 案例1-20170309-110213-TOCLOSE 案例2-20170416-110314-TOCLOSE 案例3-20171112-110715-TOCLOSE 我希望将它们重命名为: 案例一结案 案例二结案 案例3结案 基本上我只想去掉文件名中嵌入的日期和时间。由于日期和时间都不一样,我能想到的唯一方法就是将---模式重命名为just- 经过研究,我尝试了以下

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

例如,我有以下几点:

案例1-20170309-110213-TOCLOSE 案例2-20170416-110314-TOCLOSE 案例3-20171112-110715-TOCLOSE

我希望将它们重命名为:

案例一结案 案例二结案 案例3结案

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

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

重命名's/-*-*-/-/'*

很抱歉,我是一个bash脚本的初学者,我需要一些指导

多谢各位

安迪用
重命名
prename
):

  • ^([^-]+-)
    获取从开始到第一个
    -
    的部分,并将匹配项放入捕获的组1中

  • ([^-]+$)$获取最后一个
    -`之后的末尾部分,并将匹配项放入捕获的组2中

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

-n
是否尝试运行,请删除
-n
以执行实际操作


通过shell Parameter展开,获取所需部分:

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

非常详细的解释和它的工作!谢谢你的帮助!
% 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