代码之家  ›  专栏  ›  技术社区  ›  ZyX

如何获得符合某种模式的文件列表?

  •  1
  • ZyX  · 技术社区  · 14 年前

    如果文件名可能包含 \n 性格?

    :我需要纯vimscript中的解决方案,这样它将只依赖于vim。

    更新2 :

    考虑以下脚本:

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

    这就是 glob

    :echo NewGlob('/**/test')
    ['/test', '/test
    /test']
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   ghostdog74    14 年前

    你可以试着用 ls -b

        2
  •  1
  •   Community CDub    7 年前
    :echo split( glob("pattern", '.'), "\r")
    

    如果希望模式与包含 \n 独占,使用 "*\n*" .


    编辑:

    我明白了,您在文件名中使用的字符与 glob() 区分结果。因此,我们不能依赖 . good answer 然后:

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

    当然,这不是便携的。但我并没有把这称为一般情况——我从未见过这种名字。如果 全局() 必须修复。

    也许你可以尝试嵌入python或ruby,就像arnold建议的那样。但那也不是便携的。

        3
  •  0
  •   Paweł Nadolski    14 年前

    试试这个python程序。它将匹配如下文件 abc\n1 , abc\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 ')字符,带“ \不 “为了清楚起见,请用绳子。

        4
  •  0
  •   ZyX    14 年前

    最后,我不得不编写以下函数,返回与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