使用xargs轻松进行并行处理

2 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是无能。
抱歉这么久没发帖,但我还活着。

我买了块二手的Ryzen 5,结果针脚断了,只识别到一条内存,虽然发生了这些意外,但我还是设法活下来了。
我以低价又弄到了一块M-ATX的AM4主板,所以我想把那块Ryzen芯片用来组装一台迷你PC。

便捷的xargs

xargs - Wikipedia
xargs作为UNIX命令存在,非常实用。
一开始不习惯使用,但越用越能发现它的可用性,是一个非常好的命令,甚至不需要费力编写简单的单行循环语句。

Use Case

例如,假设有一些你想用yt-dlp保存的视频,并且它们每行一个。

url1
url2
url3

如果直接进行批量并行处理,CPU负载会非常高,所以如果想让它每次运行2个进程,可以这样写:

cat url-txt | xargs -I {} -P 2 yt-dlp {}

仅仅这样就能每次处理2个进程。

让我们来分解一下

那么,这是如何运作的呢?
上述内容与以下等效:

yt-dlp url1 ; yt-dlp url2
yt-dlp url3

从机制上讲,它每次执行都会运行传递给xargs的命令。
这就像是读取每一行并将其存储为数组一样。

如果没有选项呢?

如果没有选项,它会将所有参数一次性传递给xargs的命令。
由于支持的命令有限,我觉得最好还是使用-I选项。
例如以下情况:

cat url-txt | xargs yt-dlp

在这种情况下,它执行的命令如下:

yt-dlp url1 url2 url3

因此,尽可能使用-I进行处理似乎更好,但在某些情况下,没有选项也可以。

Use Case2

当你想用find命令只grepsed特定文件名时,它也很方便。

find . -name "testfile" | xargs -I {} grep "return 0" {}

像这样,只需这么短的代码就能对特定文件进行grep操作。


那么今天就到这里。
下次再见。

Related Posts