【问题标题】:Rename and transform filename via Bash通过 Bash 重命名和转换文件名
【发布时间】:2014-07-07 08:40:45
【问题描述】:

我是新手,所以请不要发誓。 我需要通过 linux 中的 shell 脚本 (bash) 将文件从旧名称重命名和转换为新名称。 我有一个像now_360p_2014-05-19-13.21.14.266-FET_0.mp4 这样的文件,但我需要得到这个2014-05-19_13-21-14_now_360p_0.mp4 我该怎么做?

小补充 - 如果文件正在被另一个进程使用,它不能被触摸。 我试过这个来探索改变命令的新结果:

#!/bin/bash

for f in (/opt/media/rec/*.mp4);
do
    nf=$(echo $f | sed -r 's/([^.]+\.)([^.]+\.)([0-9])_([^_]+)(.*)/\1\4_\2\3\5/')
    echo mv $f $nf
done

但我有一个错误((

auto.sh:第 3 行:意外标记 (' 'uto.sh: line 3:for f in (/opt/media/rec/*.mp4) 附近出现语法错误;

【问题讨论】:

  • FET 和毫秒应该从新名称中删除
  • 见@Peque 的回答。您可以向find 添加选项,以便仅考虑此类文件,例如-mmin -540
  • 在输出文件名中有一个文件夹名。例如“2014-05-15_16-42-13_/opt/media/rec/now_360p_0.mp4”
  • 摆脱它是微不足道的(例如,参见basename 命令)。

标签: linux bash rename mv


【解决方案1】:

要处理那些“基于列”的模式,awk 会更容易:

kent$  echo "now_360p_2014-05-19-13.21.14.266-FET_0.mp4"|awk -F_ -v OFS="_" '{print $3,$1,$2,$4}'
2014-05-19-13.21.14.266-FET_now_360p_0.mp4

更新

我没有仔细检查您想要的输出。还有一些你想改变的东西,例如日期和时间之间的dotFET-……现在这应该适合你(傻瓜):

awk -F_ -v OFS="_" '{sub(/\.[^.]*$/,"",$3);
                    $3=gensub(/-([^-]*$)/,"_\\1","g",$3);
                    gsub(/\./,"-",$3);
                    print $3,$1,$2,$4}'

用你的例子:

kent$  echo "now_360p_2014-05-19-13.21.14.266-FET_0.mp4" |
        awk -F_ -v OFS="_" '{sub(/\.[^.]*$/,"",$3);
                $3=gensub(/-([^-]*$)/,"_\\1","g",$3);
                gsub(/\./,"-",$3);
                print $3,$1,$2,$4}'
2014-05-19_13-21-14_now_360p_0.mp4

【讨论】:

  • 在输出文件名中有一个文件夹名。例如“2014-05-15_16-42-13_/opt/media/rec/now_360p_0.mp4”。如何删除文件夹名称?
【解决方案2】:

我认为问题出在这里:

for f in (/opt/media/rec/*.mp4);

如果你运行一个更简单的例子for f in (/opt/media/rec/*.mp4); do echo $f; done,你会得到同样的错误。

尝试使用查找:

for f in $(find /opt/media/rec/ -maxdepth 1 -iname "*.mp4");

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2020-02-18
    • 2013-10-28
    • 2013-06-15
    • 2017-01-13
    • 2016-08-01
    • 2019-05-22
    • 1970-01-01
    相关资源
    最近更新 更多