【发布时间】:2014-06-22 06:29:13
【问题描述】:
我有一长串短字符串和一长串要搜索的文本文件(实际上是要搜索的文件的嵌套文件夹)。我需要知道哪些测试字符串不存在于任何文件中。
有很多方法可以在文件中查找字符串并报告它们的位置(例如,FINDSTR),但我还没有找到一种方法来仅列出找不到的字符串。
【问题讨论】:
我有一长串短字符串和一长串要搜索的文本文件(实际上是要搜索的文件的嵌套文件夹)。我需要知道哪些测试字符串不存在于任何文件中。
有很多方法可以在文件中查找字符串并报告它们的位置(例如,FINDSTR),但我还没有找到一种方法来仅列出找不到的字符串。
【问题讨论】:
看起来您在 Windows 中。在 Unix 中很容易做到这一点,但这并不一定是障碍。
您需要与 Bourne 兼容的 shell(/sh、/ksh、/bash、/zsh 等)、grep 和测试。您可以去寻找前面的本机 Windows 版本,或者使用这些软件包安装最低限度的 Cygwin。我推荐后者,因为让这些部分一起工作更简单。
在 sh 中运行这个命令:
for each in `cat /path/to/list_of_strings.txt` ; do
grep --silent $each `cat /another/path/to/list_of_files.txt`
if [ $? -eq 1 ]; then
echo $each
fi
done
如果您在安装 Cygwin 之后觉得不舒服,您可以随时将其删除。
【讨论】:
感谢 Tripp Kinetics 提供此答案的框架,但我希望能够使用内置的 Windows 命令,而不是安装新软件,因为我将把它分发给我们团队的其他人。经过一番研究,我得出了以下结论:
SET SEARCH_COUNT=0
SET FOUND_COUNT=0
SET NOT_FOUND_COUNT=0
FOR /F "tokens=1" %%G IN (list_of_strings.txt) DO (
ECHO | SET /P unusedVar=Looking for %%G...
FINDSTR /ISPL /C:%%G "folder_to_search\*.*" >nul 2>&1
IF ERRORLEVEL 1 (
ECHO Not found
SET /A NOT_FOUND_COUNT=NOT_FOUND_COUNT+1
ECHO %%G >> not_found.txt
) ELSE (
ECHO Found!
SET /A FOUND_COUNT=FOUND_COUNT+1
ECHO %%G >> found.txt
)
SET /A SEARCH_COUNT=SEARCH_COUNT+1
)
ECHO(
ECHO Search complete.
ECHO(
ECHO Looked for %SEARCH_COUNT% strings
ECHO %FOUND_COUNT% found
ECHO %NOT_FOUND_COUNT% not found
【讨论】: