如何使用findstr,排除gvim中的svn目录
我想找出一个目录和所有子目录中包含关键字的所有文件,还有一些如何使用findstr,排除gvim中的svn目录,svn,vim,cmd,findstr,Svn,Vim,Cmd,Findstr,我想找出一个目录和所有子目录中包含关键字的所有文件,还有一些.svn目录,我应该找到这些目录 在Linux系统中,我可以通过以下方式轻松完成: grep -r keyword ./ --exclude-dir ".svn" 但是当我转到windows时,findstr是windows中grep的替代品,我尝试这样做: findstr /s keyword ./* 结果将返回.svn目录,这不是我想要的 我读了报纸 但当我像下面这样尝试时,它仍然不起作用 findstr /s key
.svn
目录,我应该找到这些目录
在Linux系统中,我可以通过以下方式轻松完成:
grep -r keyword ./ --exclude-dir ".svn"
但是当我转到windows时,findstr
是windows中grep
的替代品,我尝试这样做:
findstr /s keyword ./*
结果将返回.svn
目录,这不是我想要的
我读了报纸
但当我像下面这样尝试时,它仍然不起作用
findstr /s keyword /v ".svn" ./*
我想我使用的findstr
可能有问题。任何帮助都会很好,提前谢谢
***************************** update1 *****************************
事实上,我试图在
GVim
中使用grep
,它将调用“findstr”。AFAIK您不能排除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
但是,如果您要搜索的某些文件设置了
隐藏属性,则此操作将不起作用。假设您的文件在内容中未返回.svn\
,则此操作应能起作用
findstr /s "keyword" * |findstr /v /i /L ".svn\"
感谢@Christian.K的帮助,我解决了这个问题:
我将grepprg设置如下:
:set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\"
上述选项仅与.svn
匹配。如果要匹配gvim
中的.svn\
,应:
:set grepprg=findstr\ /s\ $*\ \ ^\\\|\ findstr\ /v\ /i\ /L\ \".svn\\\\\"
尝试创建一个包含该文件的bat文件find.bat,然后键入find。关键字
。如果需要,您可以使用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
我想知道他们是否已修复PowerShell 3中的Get ChildItem-Exclude
开关,以便您不必使用过滤器。我现在无法测试。事实上,我正在尝试在GVim
中使用grep,它将调用'findstr'。@srain然后不使用grep
?grep
将在GVim
中调用外部程序findstr
。你的意思是将grepprg设置为?这是在gvim
中使用grep
的好方法。但是,我打算通过使用findstr
或其他dos工具来完成这项工作。是的,这可能会有所帮助。这不适用于VIM的“grepprg”设置,它需要一个“open”命令行(如findstr/s
;关键字和文件模式由VIM附加)。您可以/必须将其包装在批处理文件中,并从VIM使用。@Christian.K VIM允许通过$*
指定参数的放置位置;请参见:help'grepprg'
@IngoKarkat哦,我错过了,谢谢。但是我认为使用管道仍然不起作用(至少我无法让它起作用;-)@Christian.K是的,转义(对于Vim和Windows命令提示符)不是一件小事。这似乎是可行的::set grepprg=findstr\/s\$*\\\\\\\\\\\\\\\\\\\\\\\\/v\/i\/L\\”.svn\\\“
在.svn
周围添加转义引号时(至少在语法上是可行的)::set grepprg=findstr\/s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/i\\\\\\\”.svn\\\\\\\“
@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