我有一个需要处理大量文件的Python脚本。为了绕过Linux限制传递给命令的参数数量相对较小的问题,我使用了find -print0
和xargs -0
。
我知道另一种选择是使用Python的glob模块,但当我需要进行更高级的find
命令时,这并没有什么帮助,因为它需要查找修改时间等信息。
当我在大量文件上运行我的脚本时,Python只接受其中的一部分参数,一开始我以为是在argparse
中出现了限制,但似乎是在sys.argv
中。我找不到任何关于这个问题的文档。这是一个bug吗?
下面是一个示例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或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
和-0
不应该会有问题吧?如果有换行符,我期望以上示例的sed -n '1810,1830p' filelist
会显示一些奇怪的东西。这是什么原因?我差点忘了:
$ python -V
Python 2.7.2+
filelist
。 - Benjamin Bannier~/
和-name *
参数呢? - John La Rooy