Как использовать findstr, исключить каталог svn в gvim

Я хочу найти все файлы, которые содержат ключевое слово в каталоге и всех подкаталогах, и есть несколько каталогов .svn, я должен просмотреть эти каталоги.

В системе Linux я могу сделать это легко:

  grep -r keyword ./ --exclude-dir ".svn"

Но когда я обращаюсь к окнам, findstr заменяет grep в окнах, я пытаюсь сделать это так:

  findstr /s keyword ./*

Результат вернется с каталогами .svn, а это не то, что мне нужно.

Я прочитал TN Findstr на веб-сайте Microsoft.

  /v   : Prints only lines that do not contain a match.

Но когда я пытаюсь сделать это, как показано ниже, это все равно не работает.

 findstr /s keyword /v ".svn" ./*

Я думаю, что могут возникнуть проблемы с использованием findstr. Любая помощь будет здорово, спасибо заранее.

        ***************************** update1 *****************************

На самом деле, я пытаюсь использовать grep в GVim, он вызовет 'findstr`.


person srain    schedule 29.07.2013    source источник


Ответы (4)


Насколько я знаю, вы не можете исключить определенные (под)папки в findstr. Однако в PowerShell вы можете сделать что-то вроде этого:

$root = '.'
$keyword = 'keyword'

Get-ChildItem $root -Recurse -Force | ? {
  -not $_.PSIsContainer -and $_.FullName -notlike "*\.svn*"
} | Select-String $keyword -AllMatches

Или вы можете использовать тот факт, что .svn подпапки скрыты, и сделать это:

$root = '.'
$keyword = "keyword"

Get-ChildItem $root -Recurse | ? { -not $_.PSIsContainer } |
    Select-String $keyword -AllMatches

Однако это не сработает, если для некоторых файлов, в которых вы хотите выполнить поиск, установлен атрибут hidden.

person Ansgar Wiechers    schedule 29.07.2013
comment
Интересно, исправили ли они переключатель Get-ChildItem -Exclude в PowerShell 3, чтобы вам не нужно было использовать фильтр. Я не могу проверить это там, где я сейчас. - person dan-gph; 29.07.2013
comment
На самом деле, я пытаюсь использовать grep в GVim, он вызовет 'findstr`. - person srain; 29.07.2013
comment
@srain Тогда не используй grep? - person Ansgar Wiechers; 29.07.2013
comment
grep вызовет внешнюю программу findstr в gvim. Вы имеете в виду set grepprg для Grep for Windows? Это был бы хороший способ использовать grep в gvim. Но я намерен выполнить эту работу, используя findstr или другой инструмент DOS. - person srain; 29.07.2013
comment
Да, это может помочь. - person Ansgar Wiechers; 29.07.2013
comment
@AnsgarWiechers, как вы думаете, есть ли способ выполнить эту работу с помощью findstr или других инструментов DOS? - person srain; 29.07.2013

Это должно работать, если ваши файлы не возвращают .svn\ в содержимом.

 findstr /s "keyword" * |findstr /v /i /L ".svn\"
person foxidrive    schedule 29.07.2013
comment
Это не будет работать с параметром grepprg VIM, для которого требуется открытая командная строка (например, findstr /s; ключевое слово и шаблон файла добавляются VIM). Вы могли бы/должны были бы обернуть это в пакетный файл и использовать его из VIM. - person Christian.K; 30.07.2013
comment
@Christian.K Vim позволяет указать, куда он помещает аргументы, через $*; см. :help 'grepprg'. - person Ingo Karkat; 30.07.2013
comment
@IngoKarkat О, я пропустил это, спасибо. Но я думаю, что использование трубы все еще не работает (ну, по крайней мере, я не смог заставить ее работать ;-) - person Christian.K; 30.07.2013
comment
@Christian.K Канал должен быть правильно экранирован, так как он также является разделителем команд Vim. - person Ingo Karkat; 30.07.2013
comment
@IngoKarkat Действительно. Но что такое правильное бегство в этом случае? Этот :set grepprg=findstr\ /s\ $*\ \ \|\ findstr\ /v\ /i\ /L\ ".svn\\", то есть простой "\|", похоже, не работает. VIM рассматривает только левую сторону канала как внешнюю команду. - person Christian.K; 30.07.2013
comment
@Christian.K Да, экранирование (как для Vim, так и для командной строки Windows) нетривиально. Кажется, это работает: :set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ ".svn\\" - person Ingo Karkat; 30.07.2013
comment
@Christian.K, я проверял, канал findstr after по-прежнему не работает. Работает ли это для вас? - person srain; 31.07.2013
comment
Кажется, это работает (по крайней мере, с точки зрения синтаксиса), когда вы также добавляете escape-кавычки вокруг .svn: :set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\\\" - person Christian.K; 31.07.2013
comment
@Christian.K, если я хочу сопоставить .svn\ , я должен добавить косую черту после svn, vim set grepprg будет: :set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\\\\\". Спасибо за помощь снова. - person srain; 31.07.2013

Благодаря помощи @Christian.K я решил это:

Я установил grepprg, как показано ниже:

 :set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\"

Приведенные выше параметры соответствуют только .svn. Если вы хотите, чтобы .svn\ соответствовало gvim, вам необходимо:

 :set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\\\\\"
person srain    schedule 05.10.2013

Попробуйте создать bat-файл find.bat, содержащий это, и введите find . keyword. Вы можете использовать doskey, чтобы скрыть необходимость вводить ., если хотите.

@echo off
SETLOCAL
set curDir=%1
if "%curDir%"=="." set curDir=%cd%
for /f %%i in ('dir /b/a-h-d %curDir% 2^>nul') do findstr /ilmp %2 %curDir%\%%i
for /f %%i in ('dir /b/ad-h %curDir%') do call %0 %curDir%\%%i %2
ENDLOCAL
person Christopher King    schedule 22.07.2016