Как получить список файлов, которые соответствуют некоторому шаблону? - PullRequest
1 голос
/ 26 июня 2010

Как получить список файлов, которые соответствуют некоторому шаблону, если имена файлов могут содержать \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 ]

1 голос
/ 26 июня 2010

вы можете попробовать использовать ls с опцией -b. проверьте страницу руководства

1 голос
/ 30 июня 2010
:echo split( glob("pattern", '.'), "\r")

Если вы хотите, чтобы шаблон совпадал с файлами, содержащими исключительно \n, используйте "*\n*".


EDIT:

Понятно, символ, который вы используете в имени файла, совпадает с тем, который используется glob() для различения результатов. Как следствие, мы не можем полагаться на glob(). ghostdog74 дал хороший ответ тогда:

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

Конечно, это не портативно. Но я на самом деле не называю это общим случаем - я никогда не вижу таких имен. Если glob() не может обработать этот общий случай, тогда glob() должен быть исправлен.

Может быть, вы можете попробовать со встроенным python или ruby, как предложил Арнольд. Но это тоже не портативно.

0 голосов
/ 15 марта 2011

Мне, наконец, пришлось написать следующую функцию, которая возвращает те же результаты, что и os.listdir в python:

    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
0 голосов
/ 26 июня 2010

Попробуйте эту программу на 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" для ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...