我正在尝试编写一个 shell 脚本来将大量 .wav 文件转换为 .mp3。我使用“find”命令来查找它们,然后使用“lame”命令进行转换。我可以使用一个简单的 for 循环来实现此目的,但我需要使用多个并行进程来完成此操作。
我想要定义数量的进程,例如 4。开始在每个进程中转换文件。当一个文件在一个进程中完成转换时,我将其替换为下一个文件。解决这个问题的最佳方法是什么?
答案1
我建议将列表传递给xargs
并使用-n
和/或-P
选项来控制在任何给定时间运行的进程数量。
答案2
make
对此有好处。你需要一个Makefile
类似的东西
%.mp3: %.wav
lame $(LAMEOPTS) $< $@
然后生成目标列表:
$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: \1mp3/' >>Makefile
现在,告诉make
安排任务:
$ make -r -j4 -f Makefile
答案3
我很惊讶还没有人提到 GNU 并行。使用它,命令将非常简单:
find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3
这要求将每个输入文件的扩展名替换为mp3
.默认情况下,并行运行的作业数量与计算机上的 CPU 数量相同,但您可以使用 设置不同的值-j <i>integer</i>
。开关 --dry-run 对于查看将执行哪些命令很有用。
答案4
如果您已经xjobs
安装,您会发现这正是它设计的任务类型。特别是,检查选项的描述-j
以调整创建的进程数量。