我使用GNU Parallel:
在我的macbook上运行这样的命令parallel "sample operation" ::: samplefolder/*.txt
问题是我在samplefolder
中有20,000个txt文件,导致Argument list too long
错误。
当我尝试在ubuntu机器上运行相同的脚本时,没有这样的问题。
我尝试使用谷歌搜索和阅读一些man
文件,但没有运气。我怎么解决这个问题?
谢谢!
答案 0 :(得分:2)
尝试:
ls samplefolder | grep \.txt | parallel "sample operation samplefolder/{}"
答案 1 :(得分:0)
以下是在典型的UNIX机器上处理此问题的方法(我假设OSX也有find
和xargs
):
# find samplefolder -name \*.txt -print0 | xargs -P 8 -n 1 -0 sample operation
Find将打印由NUL字符分隔的samplefolder中的所有.txt文件名。 xargs将依次读取这个以NUL分隔的列表(-0
),对于每个N个文件(-n1
- 对于这种情况下的每个文件)将最多启动sample operation path/file.txt
8(-P8
{1}})他们并行。
答案 2 :(得分:0)
将该示例操作设为bash文件: 找到samplefolder -name * .txt -print0 | xargs -P 8 -n 1 -0 ./run.sh
答案 3 :(得分:0)
使用-N
小批量处理该操作,并通过管道传输输入文件列表,而不是在命令行上给出它。
例如,扩展ArtemB的答案,以分批处理16个文件(警告,这将包含换行符的路径中断):
find samplefolder -type f -name "*.txt" | parallel -N16 "sample operation" {}
要调整最大数量的参数,您可以在环境中检查getconf ARG_MAX
。例如:
# ~$> getconf ARG_MAX
2097152
考虑到* nix上的路径通常可以是4096个字符,这使我可以自由地在命令行上放置2097152/4096 = 512个文件路径(当然不包括“示例操作”命令本身)。
类似
find samplefolder -name "*.txt" | parallel -N500 "sample operation" {}
我可以分500个批次进行处理。当然,根据运行的工具,您可能需要试验并优化批次大小以提高速度。