【发布时间】:2016-07-22 12:39:42
【问题描述】:
我有一系列目录,其中包含多个文件名为 001.mp3、002.mp3、...、030.mp3 的 mp3 文件。
我想做的是将它们按顺序放在一个 mp3 文件中,并向其中添加一些元数据。
这是我目前所拥有的(为了清楚起见,删除了一些变量定义):
#!/bin/bash
for d in */; do
cd $d
find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
cd ..
done
有时这可行,我会得到一个文件,其中所有“曲目”的顺序都正确。
但是,我经常会得到一个文件,其中所有“曲目”都以相反的顺序排列,这确实不好。
我不明白为什么脚本的不同运行之间的顺序会有所不同,因为所有目录都包含相同的文件名集。我翻遍了手册页,但找不到 find 的排序选项。
我可以运行 find . -iname '*.mp3' | sort -n >> temp.txt 将文件放入一个临时文件中,然后尝试循环遍历该文件,但我无法让它与 lame 一起使用。
有什么方法可以在 find 运行 exec 之前进行排序?我可以在此处和其他地方找到大量使用 -exec ls 执行此操作的示例,但在需要使用 exec 执行更复杂的操作的地方却找不到。
【问题讨论】:
-
在这里突破我自己 bash 能力的界限,但我可以做类似
find . -iname '*.mp3' | sort -n | xargs <something_here>的事情吗?如果是这样,我将如何重新安排蹩脚的命令来接受输入? -
temp.txt 包含完整路径还是仅包含一系列文件名?
-
如果可能的话,我宁愿不使用临时文件。但它可能被构造为包含任何类型的文件名。