如果文件名可能包含\n
字符,如何获取与某些模式匹配的文件列表?
更新:我想要纯粹的vimscript中的解决方案,所以它只取决于vim。
UPDATE2 :
考虑以下脚本:
:!touch /test ; mkdir /test$'\n' ; touch /test$'\n'/test
:echo glob('/**/test')
/test
/test
/test
这是glob
函数的输出。我希望它如下:
:echo NewGlob('/**/test')
['/test', '/test
/test']
答案 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\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
')字符替换为“\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