我是新手,所以请不要发誓我。
我需要通过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);
答案 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
我没有仔细检查您想要的输出。还有一些你想要改变的事情,例如日期和时间之间的dot
,FET
,-
......现在这应该适合你(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");