在 -exec 中运行命令之前对 find 的输出进行排序

ykn*_*vag 4 bash find lame

我有一系列目录,其中包含多个文件名为 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
Run Code Online (Sandbox Code Playgroud)

有时这行得通,我会得到一个包含所有“曲目”的文件,这些文件以正确的顺序排列。

但是,我经常会得到一个包含所有“曲目”的单个文件,这确实不好。

我无法理解的是,为什么脚本的不同运行之间的顺序会有所不同,因为所有目录都包含相同的文件名集。我翻遍了手册页,但找不到用于查找的排序选项。

我可以运行find . -iname '*.mp3' | sort -n >> temp.txt将文件放在一个临时文件中,然后尝试遍历它,但我无法让它与跛脚一起工作。

有什么办法可以在 find 运行 exec 之前进行排序?我可以在这里和其他地方找到大量-exec ls使用 exec 执行此操作的示例,但没有找到需要执行更复杂操作的示例。

mel*_*ene 5

find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
Run Code Online (Sandbox Code Playgroud)

未经测试,但可能值得一试。

通常xargs将参数附加到您给它的命令的末尾。该-I选项告诉它替换给定的字符串({}在这种情况下)。


编辑:我已经添加了-print0-z-0以确保管道仍然有效,即使你的文件名包含换行符。