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

Cok*_*kes 8 iphone bash terminal file-extension launch-daemon

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

我只是希望目录中的文件是.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
Run Code Online (Sandbox Code Playgroud)

问题是该文件是*.mp3而不是6546785.8786.mp3

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

我需要重命名只是中的.dat文件扩展名.MP3并保持文件名.

想法?建议?

fge*_*fge 27

尝试:

for file in *.dat; do mv "$file" "${file%dat}mp3"; done
Run Code Online (Sandbox Code Playgroud)

或者,如果你的shell有它:

rename .dat .mp3 *.dat
Run Code Online (Sandbox Code Playgroud)

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

并且mv不会对文件globs做任何魔术,它是扩展globs 的shell.这意味着,如果您在目录中有此文件:

t.dat
Run Code Online (Sandbox Code Playgroud)

然后你输入:

mv *.dat *.mp3
Run Code Online (Sandbox Code Playgroud)

shell会扩展*.datt.dat.但是,由于没有任何内容匹配*.mp3,shell将保持原样,这意味着完全展开的命令是:

mv t.dat *.mp3
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为字面的文件*.mp3.

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

t1.dat t2.dat
Run Code Online (Sandbox Code Playgroud)

该命令将扩展为:

mv t1.dat t2.dat *.mp3
Run Code Online (Sandbox Code Playgroud)

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

  • +1.如果将变量放入"doublequote",它也适用于带空格的文件名. (3认同)

Mat*_*att 15

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

$ brew install rename
Run Code Online (Sandbox Code Playgroud)

然后一旦重命名只安装类型(在文件所在的目录中)

$ rename -s dat mp3 *
Run Code Online (Sandbox Code Playgroud)