Visual Studio查找不包含X的文件

15

我需要一种列出所有不包含已知文本的文件的方法。

该项目包含超过1000个文件,我只想要那些不包含某些文本的文件。

我考虑过使用正则表达式,但它没有这样的功能。

有人知道解决方法吗?


这不是VS,但Windows Grep有一个功能,可以反转匹配:http://www.wingrep.com/ - Matthew Lock
4个回答

20

从命令提示符:

@for /r %f in (FILE_SPECIFIER) do @find "YOUR_STRING" "%f" > nul || echo %f
例如:
C:\web-trunk\Views>@for /r %f in (*.cshtml) do @find "Layout" "%f" > nul || echo %f

C:\data\web-trunk\Views\Account\RegisterPartial.cshtml
C:\data\web-trunk\Views\Admin\SiteInspector.cshtml
C:\data\web-trunk\Views\CandidateProfile\View.cshtml
C:\data\web-trunk\Views\Common\ContactFooterForInfoEmails.cshtml
C:\data\web-trunk\Views\Common\ContactFooterForInfoPages.cshtml
C:\data\web-trunk\Views\Common\ContactFooterForSalesEmails.cshtml
C:\data\web-trunk\Views\Common\ContactFooterForSalesPages.cshtml

Microsoft 的文档 可以帮助您找到最适合您的文件搜索术语。


有没有办法在查找不含特定文本的文件的同时,还排除某些文件类型(除了包括某些文件类型)? - thecoolmacdude

4
更新:正如Peter McVoy指出的那样,这种解决方案不起作用。它会返回错误的结果(包含没有要搜索的文本的行的文件也会被打印)。使用VS宏或自定义powershell脚本可能是更好的方式。我以后可能会重新审视这个答案。
供参考,以下是我的答案:
您可以在命令行上执行此操作:
findstr /S /V /M text_to_search_for *.cs

这将打印出不包含指定文本的所有文件名。


我本希望有一个内置的Visual Studio解决方案,可以轻松打开我的文件,但现在这个也可以。 - jerone
5
这只是列出那些含有不包含搜索文本行的文件吗?例如,一个文件中如果有一行不含搜索文本,即使它在文件的其他地方存在,该文件也会被列出。 - Peter McEvoy
@Peter McEvoy:发现得好!已编辑。@jerone请取消接受此答案,因为它是错误的... - jeroenh

3
您可以使用Notepad++中的“在文件中查找”功能。
步骤如下:
  1. 输入要查找的单词并选择目录。
  2. 复制搜索结果。
  3. 过滤它以检索包含该单词的文件列表。
  4. 然后在C#中运行一个简单的循环来获取不在此列表中的文件列表。这些是不包含该单词的文件。
这是获取文件列表的循环(在.cs文件中搜索)(可以进行优化):
private void GetFileNamesNotContainingWord(string filePath, string searchDirectoryPath, string notContainingFilePath)
{
    string[] lines = File.ReadAllLines(filePath);
    List<string> filesList = new List<string>();

    foreach (string line in lines)
    {
        if (!line.StartsWith("\t"))
        {
            filesList.Add(line.Substring(0, line.LastIndexOf('(')).Trim());
        }
    }

    List<string> notContainedFiles = new List<string>();
    foreach (FileInfo file in new DirectoryInfo(searchDirectoryPath).GetFiles("*.cs", SearchOption.AllDirectories))
    {
        if (!filesList.Contains(file.FullName))
        {
            notContainedFiles.Add(file.FullName);
        }
    }

    File.WriteAllLines(notContainingFilePath, notContainedFiles.ToArray());
}

3
这种方法在Visual Studio中也是可行的,不需要建议在此处使用其他工具。可以使用全局搜索来获取项目所有文件的列表以及包含文本的文件列表。有趣的问题是:是否有内置功能帮助从第一个列表中“减去”第二个列表? - Doc Brown

1

使用命令窗口(“DOS框”)中的findfindstr


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接