我正在开发一个简单的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
)为目录。