|
Vim 开发时遇到的一个问题,需要一个可以展开 shell 通配符的函数。
描述:
用 POSIX shell(或一系列 POSIX 工具)写一个函数来模拟 csh 的 glob (或 zsh 的
print -N)
简单解释:
例如,csh 的 'glob *.txt' 和 zsh 的 'print -N *.txt' 都可以返回以NULL为分割符的当前目录里的 txt 文件名列表。
几点要求:
1) 可移植性,所有 POSIX 兼容 shell.
2) 性能
3) 代码尽可能简洁
为了说清楚,再举两个例子。
例1: (返回 /usr/ 下的文件及目录名称列表)
$ for i in /usr/*; do printf "%s\0" $i; done
例2: (返回当前目录下的扩展名为o 的文件列表)
$ printf "%s\0" *.o
例1 和 例2 就是需要的功能, 但是都有各自的问题。
例1 的问题是性能。当可匹配的数目巨大时,性能差。
例2 的问题是, 如果 printf 不是built-in 的 (像ksh),则参数的数目受限(当匹配数
目接近ARG_MAX 时, 会有 "Argument list too long", 的错误。)
我考虑过用 find, awk 等工具代替,可是个人能力有限,对 shell 不太熟
悉,不知大家有没有好的解决办法?谢谢! |
|