使用terminal/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没有对文件globs做任何魔法,它是shell扩展globs。这意味着,如果目录中有这个文件:

t.dat

而你输入:

mv *.dat *.mp3

外壳将*.dat扩展到t.dat。但是,由于没有任何内容与*.mp3匹配,shell将保留它,这意味着完全展开的命令是:

mv t.dat *.mp3

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

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

命令将展开为:

mv t1.dat t2.dat *.mp3

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

对于mac上的任何人来说,如果你有BREW,这很容易,如果你没有BREW,那么我的建议是得到它。然后在安装时,只需执行以下命令

$ brew install rename

然后一旦安装了rename,只需键入(在文件所在的目录中)

$ rename -s dat mp3 *

最新更新