我有一个Python脚本需要处理大量文件。为了解决 Linux 对可传递给命令的参数数量相对较小的限制,我使用find -print0
with xargs -0
.
我知道另一种选择是使用 Python 的 glob 模块,但是当我有更高级的模块时,这将无济于事find
命令,寻找修改时间等。
当在大量文件上运行我的脚本时,Python 只接受参数的子集,我首先想到的一个限制是argparse
,但似乎在sys.argv
。我找不到任何关于此的文档。这是一个错误吗?
下面是一个说明这一点的 Python 脚本示例:
import argparse
import sys
import os
parser = argparse.ArgumentParser()
parser.add_argument('input_files', nargs='+')
args = parser.parse_args(sys.argv[1:])
print 'pid:', os.getpid(), 'argv files', len(sys.argv[1:]), 'argparse files:', len(args.input_files)
我有很多文件要运行它:
$ find ~/ -name "*" -print0 | xargs -0 ls > filelist
748709 filelist
但看来xargs http://en.wikipedia.org/wiki/Xargs或者 Python 正在对我的大文件列表进行分块,并使用几个不同的 Python 运行来处理它:
$ find ~/ -name "*" -print0 | xargs -0 python test.py
pid: 4216 argv files 1819 number of files: 1819
pid: 4217 argv files 1845 number of files: 1845
pid: 4218 argv files 1845 number of files: 1845
pid: 4219 argv files 1845 number of files: 1845
pid: 4220 argv files 1845 number of files: 1845
pid: 4221 argv files 1845 number of files: 1845
...
为什么要创建多个进程来处理该列表?为什么它会被分块呢?我认为文件名中没有换行符,也不应该-print0
and -0
处理这个问题吗?如果有换行符,我希望sed -n '1810,1830p' filelist
以显示上面示例的一些奇怪之处。是什么赋予了?
我差点忘了:
$ python -V
Python 2.7.2+