如何获取与某些模式匹配的文件列表?

时间:2010-06-26 10:50:12

标签: linux unix filenames vim

如果文件名可能包含\n字符,如何获取与某些模式匹配的文件列表?

更新:我想要纯粹的vimscript中的解决方案,所以它只取决于vim。

UPDATE2

glob函数的预期输出

考虑以下脚本:

:!touch /test ; mkdir /test$'\n' ; touch /test$'\n'/test
:echo glob('/**/test')
/test
/test
/test

这是glob函数的输出。我希望它如下:

:echo NewGlob('/**/test')
['/test', '/test
/test']

4 个答案:

答案 0 :(得分:1)

您可以尝试将ls-b选项一起使用。查看手册页

答案 1 :(得分:1)

:echo split( glob("pattern", '.'), "\r")

如果您希望模式与包含\n的文件完全匹配,请使用"*\n*"


编辑:

我知道,您在文件名中使用的字符与glob()用于区分结果的字符相同。因此,我们不能依赖glob()。 ghostdog74给了good answer然后:

:echo split( system('ls -1bd test*'), "\n")  

当然,这不便携。但我并不认为这是一般情况 - 我从未见过这种名字。如果glob()无法处理此一般情况,则必须修复glob()

可能是你可以尝试使用嵌入式python或者ruby,正如arnold建议的那样。但这也不便携。

答案 2 :(得分:0)

试试这个python程序。它会匹配abc\n1abc\n2abc等文件

#!/usr/bin/env python
import os, re
dirlist = os.listdir('.')
pattern = 'abc\n\\d'
for fname in dirlist:
  if re.search(pattern, fname):
    print fname.replace('\n', '\\n')

为了清晰起见,它会将行尾('\n')字符替换为“\n”字符串。

答案 3 :(得分:0)

我最后不得不编写以下函数,它返回与python的os.listdir相同的结果:

    function s:globdir(directory, ...)
        return split(glob(escape(a:directory.g:os#pathSeparator, '`*[]\').
                    \     get(a:000, 0, '*')),
                    \"\n", 1)
    endfunction
    function s:GetDirContents(directory)
        let dirlist = s:globdir(a:directory)+s:globdir(a:directory, '.*')
        let nlnum=len(split(a:directory, "\n", 1))-1
        let r=[]
        let i=0
        let addfragment=""
        for directory in dirlist
            if i<nlnum
                let i+=1
                let addfragment=directory."\n"
                continue
            else
                let directory=addfragment.directory
                let i=0
                let addfragment=""
            endif
            let tail=fnamemodify(directory, ':t')
            if tail==#'.' || tail==#'..'
                continue
            endif
            if directory[0]!=#'/'
                let r[-1].="\n".directory
            else
                call add(r, tail)
            endif
        endfor
        return r
    endfunction