【发布时间】:2018-01-16 05:32:36
【问题描述】:
我有一个可以同时处理 ~256 个文件的程序(编辑:命令行参数数量给出的限制);而且我必须对我拥有的许多文件(超过 100k)执行它。
为此,目前,我使用一个简单的循环,为每个文件一个接一个地调用我的程序一次。
FILESLIST="$(find /folder/where/the/files/are/ -name '*.xml' 2>/dev/null)"
FILESTAB=($FILESLIST)
for f in "${FILESTAB[@]}"
do
./myProgram $f || break
done
但是为了提高我的处理速度,我每次都需要使用我的程序有多个文件,如下所示:
./myProgram path/to/file1.xml path/to/file2.xml ...
我想到了类似下面的东西,但我找不到一个好主意来做这个(见 cmets):
FILESLIST="$(find /folder/where/the/files/are/ -name '*.xml' 2>/dev/null)"
FILESTAB=($FILESLIST)
while [ ${#FILESTAB[@]} -gt 256 ]
do
ListOf256FilesNames=$FILETAB[0:256] # << My problem is to do this
FILETAB=$FILETAB[256:end] # shifting array # << and do this too
./myProgram $ListOf256FilesNames # << this works supposing the 2 lines before works
done
./myProgram $FILESTAB # do the work for remaining files
有没有我想做的事情,或者你有什么想法用另一种方式来做?
【问题讨论】:
-
见Using Find。这讨论了正确将结果读取到数组中(您在上面使用的方法会因带有空格、换行符、可扩展 glob 表达式等的文件名而严重失败)。
-
顺便说一句,您是否有理由一次执行 256 个批次,而不是让
xargs将您的列表拆分为可行的最大可能批次大小? -
哦,告诉我更多关于这个的(我不知道这种使用xargs的事情)
-
顺便说一句,见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段,变量命名约定——全大写的名称由对操作系统或shell有意义的变量使用,而命名空间至少有一个小写-保证应用程序可以安全使用大小写字符,而不会干扰系统行为。
标签: arrays shell loops command-line-arguments