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

时间:2016-07-22 12:39:42

标签: bash find lame

我有一系列包含多个mp3文件的目录,文件名为001.mp3,002.mp3,...,030.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 . -iname '*.mp3' | sort -n >> temp.txt将文件放在一个临时文件中,然后尝试循环使用它,但是我无法让它与lame一起工作。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

修改:我已添加-print0-z-0,以确保即使您的文件名包含换行符,管道仍可正常运行。< / p>