通过Bash重命名和转换文件名

时间:2014-05-19 11:43:28

标签: linux bash rename mv

我是新手,所以请不要发誓我。 我需要通过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行:f in中意外标记(' 'uto.sh: line 3:附近的语法错误(/ opt / media / rec / *。mp4);

2 个答案:

答案 0 :(得分: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- ......现在这应该适合你(gawk):

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

答案 1 :(得分:1)

我认为问题在于:

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

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

尝试使用find:

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