使用 xargs 輕鬆進行並行處理

2 min

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

大家好,我是無能。
很抱歉這麼久沒發文,但我還活著。

我買了一顆二手的 Ryzen 5,沒想到針腳彎曲了,還發生了只識別到一條記憶體等問題,但我還是設法過著生活。
我以便宜的價格又買了一張 M-ATX 的 AM4 主機板,所以我想把那顆 Ryzen 晶片用來組裝成一台迷你 PC。

方便的 xargs

xargs - 維基百科
作為 UNIX 命令存在的xargs非常方便。
一開始不習慣使用,但越用越能發現其可用性,是一個非常好的命令,甚至不需要費力寫一行簡單的迴圈語句。

使用案例

例如,假設您有一些想用yt-dlp儲存的影片,並且它們每行一個。

url1
url2
url3

當然,如果一次性將它們全部傳遞給並行處理,CPU 負載會變得非常高,因此如果您想每次運行兩個進程,可以如下所示編寫。

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

令人驚訝的是,僅僅這樣就可以每次處理兩個進程。

讓我們來分解它

那麼,這是如何運作的呢?
上述內容等同於以下:

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

從機制上來說,這表示每次執行時都會運行傳遞給xargs的命令。
這可以想像成是讀取一行並將其儲存為陣列嗎?

如果沒有選項呢?

如果沒有選項,它會將所有內容一次性傳遞給傳給xargs的命令。
由於支援的命令有限,我覺得最好使用-I選項。
例如以下情況:

cat url-txt | xargs yt-dlp

在這種情況下,會執行以下命令:

yt-dlp url1 url2 url3

因此,盡可能使用-I進行處理似乎更好,但在某些關鍵情況下,沒有選項也可能沒問題。

使用案例2

當您想使用find命令只對特定檔名進行grepsed時,它也很方便。

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

像這樣,只需這麼簡短的描述,就可以只對特定檔案進行grep


那麼今天就到這裡。
下次再見了。

Related Posts