2011-05-06 27 views
8

Necesito una forma de enumerar todos los archivos que NOT contienen un texto conocido.Visual studio Buscar archivos que NO contenga X

El proyecto contiene más de 1000 archivos y solo quiero los que no contienen texto.

Pensé en expresiones regulares, pero no tiene esa característica.

¿Alguien sabe una solución?

+0

No es VS pero Windows Grep tiene una característica que le permite invertir un partido: http://www.wingrep.com/ –

Respuesta

14

Desde un símbolo del sistema:

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

Por ejemplo:

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 
+0

Funciona de maravilla, gracias –

+0

Cualquier idea sobre cómo encontrar archivos que no contienen un texto en particular, pero también excluir ciertos tipos de archivos (además de incluir ciertos tipos de archivos) tipos de archivo)? – thecoolmacdude

+1

@thecoolmacdude Quizás puedas usar esto: https://superuser.com/a/383646/494173 – mbomb007

3

Puede usar la función Find in Files de notepad++.

Pasos:

  1. Escriba la palabra que desea buscar y seleccionar el directorio.
  2. Copie el resultado de la búsqueda.
  3. Filtrar para recuperar la lista de archivos que contiene la palabra.
  4. Y luego ejecute un bucle simple en C# para obtener la lista de archivos que no son en esta lista. Estos son los archivos que no contienen la palabra.

Aquí es el bucle para obtener los archivos de la lista es (.cs búsquedas en archivos) (puede ser optimizado):

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()); 
} 
+2

Este enfoque también es posible con Visual Studio, no es necesario sugerir el uso de una herramienta adicional aquí. Se puede usar una búsqueda global para obtener una lista de todos los archivos del proyecto y una lista de archivos que contienen el texto. La pregunta interesante es: ¿existe una funcionalidad integrada que ayude a "restar" la segunda lista de la primera? –

3

ACTUALIZACIÓN: como Peter McVoy señaló, esta solución no funciona. Devolverá falsos positivos (también se imprimirán los archivos que contienen una línea sin el texto para buscar). Una macro VS o una secuencia de comandos personalizada de powershell es probablemente el camino a seguir. Podría volver a visitar esta respuesta más tarde.

de referencia, esta fue mi respuesta:

Usted puede hacer esto en la línea de comandos:

findstr /S /V /M text_to_search_for *.cs 

Esto imprimirá todos los nombres de archivo que no contienen el texto

+1

+1 ¡más rápido y mejor! –

+0

Esperaba una solución de Visual Studio incorporada, donde puedo abrir mis archivos fácilmente, pero esto funcionará por el momento. – jerone

+0

@jerone siempre puede escribir una macro en VS también ... – jeroenh

2

Utilice busque o findstr desde una ventana de comandos ('DOS b buey').

Cuestiones relacionadas