2014-04-16 68 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