使用xargs轻松进行并行处理
大家好,我是无能。
抱歉这么久没发帖,但我还活着。
我买了块二手的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命令只grep或sed特定文件名时,它也很方便。
find . -name "testfile" | xargs -I {} grep "return 0" {}
像这样,只需这么短的代码就能对特定文件进行grep操作。
那么今天就到这里。
下次再见。