Visual Studio Находит файлы, которые не содержат X

#regex #visual-studio #visual-studio-2008 #find

#регулярное выражение #visual-studio #visual-studio-2008 #Найти

Вопрос:

Мне нужен способ перечислить все файлы, которые не содержат известный текст.

Проект содержит более 1000 файлов, и мне нужны только те, которые не содержат текста.

Я думал о регулярных выражениях, но у него нет такой функции.

Кто-нибудь знает решение?

Комментарии:

1. Это не VS, но в Windows Grep есть функция, позволяющая инвертировать совпадение: wingrep.com

Ответ №1:

Из командной строки:

 @for /r %f in (FILE_SPECIFIER) do @find "YOUR_STRING" "%f" > nul || echo %f
  

Например:

 C:web-trunkViews>@for /r %f in (*.cshtml) do @find "Layout" "%f" > nul || echo %f

C:dataweb-trunkViewsAccountRegisterPartial.cshtml
C:dataweb-trunkViewsAdminSiteInspector.cshtml
C:dataweb-trunkViewsCandidateProfileView.cshtml
C:dataweb-trunkViewsCommonContactFooterForInfoEmails.cshtml
C:dataweb-trunkViewsCommonContactFooterForInfoPages.cshtml
C:dataweb-trunkViewsCommonContactFooterForSalesEmails.cshtml
C:dataweb-trunkViewsCommonContactFooterForSalesPages.cshtml
  

Документация Microsoft по этому методу может помочь вам найти наилучший термин для поиска файлов.

Комментарии:

1. Есть идеи о том, как по-прежнему находить файлы, которые не содержат определенного текста, но при этом исключать определенные типы файлов (в дополнение к включению определенных типов файлов)?

Ответ №2:

ОБНОВЛЕНИЕ: как указал Питер Маквой, это решение не работает. Это вернет ложные срабатывания (файлы, содержащие строку без текста для поиска, также будут напечатаны). Макрос VS или пользовательский скрипт powershell, вероятно, являются правильным решением. Я мог бы вернуться к этому ответу позже.

Для справки, это был мой ответ:

Вы можете сделать это в командной строке:

 findstr /S /V /M text_to_search_for *.cs
  

При этом будут напечатаны все имена файлов, которые не содержат текста

Комментарии:

1. Я надеялся на встроенное решение Visual Studio, с помощью которого я смогу легко открывать свои файлы, но на данный момент этого достаточно.

2. Не будет ли это просто перечислять файлы, в строках которых нет текста поиска? Т.е. файл, содержащий одну строку без текста поиска, будет указан, даже если он есть в другом месте файла

3. @Питер Макэвой: хороший улов! Отредактировано. @jerone пожалуйста, не принимайте этот ответ, поскольку он неверный…

Ответ №3:

Вы можете использовать функцию поиска в файлах в notepad .

Шаги:

  1. Введите слово, которое вы хотите найти, и выберите каталог.
  2. Скопируйте результат поиска.
  3. Отфильтруйте его, чтобы получить список файлов, содержащий это слово.
  4. А затем запустите простой цикл на C #, чтобы получить список файлов, которых нет в этом списке. Это файлы, которые не содержат word.

Вот цикл для получения списка файлов is (поиск в .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());
}
  

Комментарии:

1. Этот подход возможен также с Visual Studio, здесь нет необходимости предлагать использовать дополнительный инструмент. Можно использовать глобальный поиск, чтобы получить как список всех файлов проекта, так и список файлов, содержащих текст. Интересный вопрос: существует ли встроенная функциональность, которая помогает «вычитать» 2-й список из первого?

Ответ №4:

Используйте find или findstr из окна командной строки (‘DOS box’).