用终端/ bash更改目录中多个文件的文件扩展名?

问题描述:

我正在开发一个简单的launchdaemon,将文件从一个目录复制到另一个目录。我已经获得了文件传输的罚款。用终端/ bash更改目录中多个文件的文件扩展名?

我只是想在目录中的文件是mp3的,而不是.dat文件的

某些文件是这样的:

6546785.8786.dat
3678685.9834.dat
4658679.4375。 DAT

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

6546785.8786.mp3
3678685.9834.mp3
4658679.4375.mp3

这是我在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并没有对文件进行任何魔术,它是shell它扩大了球体。这意味着,如果你有在目录这个文件:

t.dat 

,并键入:

mv *.dat *.mp3 

外壳将扩大到*.datt.dat。然而,由于没有将匹配*.mp3,外壳会离开原样,这意味着完全展开的命令是:

mv t.dat *.mp3 

这将创建一个名为文件,从字面上看,*.mp3

如果,另一方面,你有几个文件命名为*.dat,如:

t1.dat t2.dat 

命令会扩展为:

mv t1.dat t2.dat *.mp3 

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

+0

这伟大的工作。我发誓我认为我在整个互联网上搜索了正确的答案。非常感谢。现在我需要弄清楚如何将这个.mp3的名称自动命名为歌曲的名称。 – CokePokes 2011-12-18 13:35:41

+0

没问题:)另请参阅编辑,有另一个更好的命令来做到这一点。并且不要忘记接受答案;) – fge 2011-12-18 13:36:29

+3

+1。如果您将变量放入“doublequote”中,它也适用于带空格的文件名。 – 2011-12-18 21:34:06

对于Mac上的任何人,如果你有BREW,这很容易,如果你没有酿造,那么我的建议是得到它。然后只需安装时只需做到这一点

$ brew install rename 

那么一旦改名,安装只需输入(在该文件的目录)

$ rename -s dat mp3 *