我正在开发一个简单的launchdaemon,它将文件从一个目录复制到另一个目录。我已经把文件转移过来了。

我只希望目录中的文件是.mp3而不是.dat的

其中一些文件如下所示:



我希望他们看起来像这样:



这就是我在bash脚本结尾处用来重命名文件扩展名的内容。

cd $mp3_dir
mv *.dat *.mp3
exit 0

问题是文件显示为* .mp3而不是6546785.8786.mp3

并且当另一个6546785.8786.dat文件导入到$ mp3_dir时,*。mp3被新的.mp3覆盖。

我需要将.dat文件扩展名重命名为到.mp3,并保留文件名。

有想法吗?有什么建议吗?

最佳答案

尝试:

for file in *.dat; do mv "$file" "${file%dat}mp3"; done

或者,如果您的 shell 上有:
rename .dat .mp3 *.dat

现在,为什么命令不起作用:首先,可以肯定的是,将目录重命名为*.mp3时,目录中只有一个文件,否则mv会因*.mp3: not a directory而失败。

而mv并没有对文件glob做任何魔术,而是 shell 扩展了glob。这意味着,如果您在目录中有此文件:
t.dat

然后您输入:
mv *.dat *.mp3

该 shell 将*.dat扩展为t.dat。但是,由于没有任何匹配*.mp3的内容,shell会按原样保留它,这意味着完全扩展的命令是:
mv t.dat *.mp3

它将创建一个名为*.mp3的文件。

另一方面,如果您有几个名为*.dat的文件,如下所示:
t1.dat t2.dat

该命令将扩展为:
mv t1.dat t2.dat *.mp3

但这将失败:如果mv有两个以上的参数,则它期望最后一个参数(即*.mp3)为目录。

10-07 19:53
查看更多