使用 xargs 輕鬆進行並行處理
大家好,我是無能。
很抱歉這麼久沒發文,但我還活著。
我買了一顆二手的 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命令只對特定檔名進行grep或sed時,它也很方便。
find . -name "testfile" | xargs -I {} grep "return 0" {}
像這樣,只需這麼簡短的描述,就可以只對特定檔案進行grep。
那麼今天就到這裡。
下次再見了。