2014-04-16 49 views
2

我在我的MacBook運行這樣的命令,使用GNU並行:GNU並行,輸入文件太多,參數列表太長

parallel "sample operation" ::: samplefolder/*.txt 

的問題是,我有20,000個警報txt文件在samplefolder,這導致Argument list too long錯誤。

當我試着在ubuntu機器上運行相同的腳本時沒有這樣的問題。

我試過Google搜索和閱讀一些man文件,但沒有運氣。我怎麼解決這個問題?

謝謝!

回答

2

嘗試:

ls samplefolder | grep \.txt | parallel "sample operation samplefolder/{}" 
+0

如果某些文件名中有空格,這將會遇到麻煩。 – ArtemB

+0

爲什麼?你有沒有嘗試過?請不要假設GNU Parallel腦死亡。 –

+0

更正 - 「如果文件名中有換行符」。 GNU並行每行讀取一個參數,因此空間將會正常。如果文件名中有換行符(在UNIX上仍然是有效的文件名),則爲Nut GNU並行將視爲多個文件名。是的,這次我測試了它。 :-) – ArtemB

0

這裏是你如何處理這個在典型的UNIX系統中(我假設OSX有findxargs太):

# find samplefolder -name \*.txt -print0 | xargs -P 8 -n 1 -0 sample operation 

查找將打印所有.txt文件samplefolder中的名稱用NUL字符分隔。 xargs依次讀取這個以NUL分隔的列表(-0),並且對於每個N個文件(-n1 - 對於這種情況下的每個文件)將會啓動sample operation path/file.txt並且最多可以有8個(-P8)。

+0

但是我的'樣本操作'實際上是一個非常長的包含幾個'{}'的操作。我不知道如何正確調整我的命令來使用'xargs',並且我一直在收到'沒有這樣的文件或目錄'錯誤。 – syg

+0

無論如何,您的解決方案可能會幫助他人。 @ Ole的答案適合我。 – syg

0

只是讓該示例操作成爲bash文件: find samplefolder -name * .txt -print0 | xargs -P 8 -n 1 -0 ./run.sh