加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

AWK,SED,REGEX重命名文件

发布时间:2020-12-13 18:50:24 所属栏目:Linux 来源:网络整理
导读:我只是学习使用REGEX,AWK和SED.我目前有一组我想要重命名的文件 – 它们都位于一个目录中. 命名模式是一致的,但我想重新安排文件名,这里是格式: 01._HORRIBLE_HISTORIES_S2.mp402._HORRIBLE_HISTORIES_S2.mp4 我想将它们重命名为HORRIBLE_HISTORIES_s01e01.
我只是学习使用REGEX,AWK和SED.我目前有一组我想要重命名的文件 – 它们都位于一个目录中.

命名模式是一致的,但我想重新安排文件名,这里是格式:

01._HORRIBLE_HISTORIES_S2.mp4
02._HORRIBLE_HISTORIES_S2.mp4

我想将它们重命名为HORRIBLE_HISTORIES_s01e01.mp4 – 其中e01是从第一列收集的.我知道我想要从第一列中获取“01”,将其填入变量中,然后将其粘贴到每个文件名中的S2之后,同时我想将其从文件名的开头与“.”一起删除. _“,另外我想将”S2“改为”s02“.

如果有人会这么善良,你能帮助我用awk / sed写一些东西并解释一下我可以从中学到的程序吗?

解决方法

for f in *.mp4; do 
  echo mv "$f" 
    "$(awk -F '[._]' '{ si = sprintf("%02s",substr($5,2)); 
                          print $3 "_" $4 "_s" si "e" $1 "." $6 }' <<<"$f")"
done

>循环所有* .mp4文件.
>将每个重命名为awk命令的结果,通过命令替换($(…))提供.
> awk命令将输入??文件名拆分为令牌.或“_”(使第一个令牌可用作$1,第二个令牌为$2,……).
>首先,将“_S {number}”中的数字左边填充为2位数,并为0(即,如果数字不具有2位数,则仅预设0)并存储在变量si(季节索引)中;如果总是在前面加0,那么awk“程序”可以简化为:{print $3“_”$4“_s0”substr($5,2)“e”$1“.” $6}
>然后重新排列结果以及剩余的标记以形成所需的文件名.

注意mv之前的echo以允许您安全地预览生成的命令 – 将其删除以执行实际重命名.

替代方案:使用正则表达式的纯bash解决方案:

for f in *.mp4; do 
  [[ $f =~ ^([0-9]+)._([^.]+)_S([^.]+).(.+)$]]
  echo mv "$f" 
"${BASH_REMATCH[2]}_s0${BASH_REMATCH[3]}e${BASH_REMATCH[1]}.${BASH_REMATCH[4]}"
done

>使用bash的正则表达式匹配运算符=?,使用捕获组((…)中的子字符串)匹配每个文件名并提取感兴趣的子字符串.
>匹配结果存储在特殊数组变量$BASH_REMATCH中,元素0包含整个匹配,1包含与第一个捕获组匹配的内容,2包含第二个捕获组,依此类推.
>然后,mv命令的target参数按所需顺序组装捕获组匹配项;请注意,在这种情况下,为简单起见,我使s {number}的无填充无条件 – 简单地预先设置了0.

如上所述,您需要在mv之前删除echo以执行实际重命名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读