查找包含字符串 x 并排除字符串 y 的文件
Finding files that contain string x and excludes string y
我有一个文件目录,里面有许多 .pdf
个文件。
我想计算目录中有多少文件包含单词 SSN
,不包括其中还包含单词 testversion *.1
的文件。
现在我有以下代码来检查哪些文件中有单词 SSN
:
findstr /S /I /M ssn *.pdf
因此需要显示包含单词 SSN
和短语 testversion 1.2
的文件。
不需要显示包含单词 SSN
和短语 testversion 1.1
的文件。
我想我需要用 /R
正则表达式命令做点什么,但我还没有掌握正则表达式。
@echo off
setlocal
set "count=0"
for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
for /f "delims=" %%B in ('findstr /i /r /m /c:"\<ssn\>" "%%~A"') do set /a "count+=1"
)
echo %count%
首先检查 testversion digits.digit
,其中最后一位不是 1
,因为那是条件值,然后检查 ssn
。 for
都循环 return 文件名,因此您可以在定义的地方使用 echo %%A
或 echo %%B
检查文件名。
在正则表达式中:*
是前一个字符或集合,0 次或多次。使用 dir
命令等。 *
是通配符。只是要注意区别。
由于 pdf 文件是二进制文件(+ 一些文本)而不是所有文本,因此无法保证字边界 \<
和 \>
是否有效好等等。模式可能需要根据需要进行调整。纯文本文件肯定会更好,因为正则表达式不是为二进制设计的。
这可能只是为了计数更快:
@echo off
setlocal
set "count=0"
for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
findstr /i /r /m /c:"\<ssn\>" "%%~A" >nul && set /a "count+=1"
)
echo %count%
这消除了第二个 for
循环。
我有一个文件目录,里面有许多 .pdf
个文件。
我想计算目录中有多少文件包含单词 SSN
,不包括其中还包含单词 testversion *.1
的文件。
现在我有以下代码来检查哪些文件中有单词 SSN
:
findstr /S /I /M ssn *.pdf
因此需要显示包含单词 SSN
和短语 testversion 1.2
的文件。
不需要显示包含单词 SSN
和短语 testversion 1.1
的文件。
我想我需要用 /R
正则表达式命令做点什么,但我还没有掌握正则表达式。
@echo off
setlocal
set "count=0"
for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
for /f "delims=" %%B in ('findstr /i /r /m /c:"\<ssn\>" "%%~A"') do set /a "count+=1"
)
echo %count%
首先检查 testversion digits.digit
,其中最后一位不是 1
,因为那是条件值,然后检查 ssn
。 for
都循环 return 文件名,因此您可以在定义的地方使用 echo %%A
或 echo %%B
检查文件名。
在正则表达式中:*
是前一个字符或集合,0 次或多次。使用 dir
命令等。 *
是通配符。只是要注意区别。
由于 pdf 文件是二进制文件(+ 一些文本)而不是所有文本,因此无法保证字边界 \<
和 \>
是否有效好等等。模式可能需要根据需要进行调整。纯文本文件肯定会更好,因为正则表达式不是为二进制设计的。
这可能只是为了计数更快:
@echo off
setlocal
set "count=0"
for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
findstr /i /r /m /c:"\<ssn\>" "%%~A" >nul && set /a "count+=1"
)
echo %count%
这消除了第二个 for
循环。