Bash 文件名重命名-子字符串日期删除
我正在尝试将文件名格式为ABCD-YYMMDD-HHMMSS-EFGH的文件列表重命名为ABCD-EFGH 例如,我有以下几点: 案例1-20170309-110213-TOCLOSE 案例2-20170416-110314-TOCLOSE 案例3-20171112-110715-TOCLOSE 我希望将它们重命名为: 案例一结案 案例二结案 案例3结案 基本上我只想去掉文件名中嵌入的日期和时间。由于日期和时间都不一样,我能想到的唯一方法就是将---模式重命名为just- 经过研究,我尝试了以下方法,但没有成功: 重命名's/-*-*-/-/'* 很抱歉,我是一个bash脚本的初学者,我需要一些指导 多谢各位 安迪用Bash 文件名重命名-子字符串日期删除,bash,Bash,我正在尝试将文件名格式为ABCD-YYMMDD-HHMMSS-EFGH的文件列表重命名为ABCD-EFGH 例如,我有以下几点: 案例1-20170309-110213-TOCLOSE 案例2-20170416-110314-TOCLOSE 案例3-20171112-110715-TOCLOSE 我希望将它们重命名为: 案例一结案 案例二结案 案例3结案 基本上我只想去掉文件名中嵌入的日期和时间。由于日期和时间都不一样,我能想到的唯一方法就是将---模式重命名为just- 经过研究,我尝试了以下
重命名(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