Recherche par lots dans les répertoires / fichiers de plusieurs chaînes distinctes avec des résultats pour chaque chaîne


1

Je voudrais rechercher récursivement dans un répertoire parent et tous les sous-répertoires plusieurs chaînes séparées et afficher les résultats pour chaque chaîne. Par exemple:

Texte à rechercher

Foo
Bar
Fizz
Buzz
(list continues for several hundred words)

Volet Résultats

Foo
  - Found in files x, y, z
Bar
  - Found in files x, y
Fizz
  - Not found in any files
Buzz
  - Found in files y, z

Résumé
J'ai une liste de plusieurs centaines de chaînes que je devrai chercher plusieurs fois. C'est un processus fastidieux de rechercher des chaînes individuelles et je cherche un moyen de le faire en batch.

Existe-t-il des programmes Windows pouvant effectuer ce type de recherche?

FWIW
J'ai essayé avec notepad ++ et Visual Studio, mais je n'ai pas encore trouvé le moyen de répondre aux exigences d'affichage de chaque chaîne comme résultat séparé.

Réponses:


2

Le script de lot ci-dessous ferait ceci.

@echo off

for /F %%i in (pattern.txt) do (
echo Files containing %%i
findstr /M /C:%%i /S *.txt
)        

Dans le cas où la chaîne ne figure dans aucun des fichiers, l’instruction souhaitée n’est pas imprimée. Au lieu de cela, il imprime une liste vide de fichiers. la source: Commande Findstr


1

le Couteau suisse a une commande "hexfind" qui peut rechercher un nombre quelconque de modèles en parallèle. Créez un fichier de modèle de recherche "mypatterns.txt" contenant:

/Foo/
/Bar/
/Fizz/
/Buzz/

Et pour rechercher tous les fichiers du dossier mydir, y compris tous les sous-dossiers, tapez:

sfk hexfind -bylist mypatterns.txt mydir

Cela produira un dump de chaque hit trouvé, comme:

testfiles\Formats\10-dir-list.txt : hit at offset 0x273
>4261724D 75672E68 70700D0A 433A5C73< BarMug.hpp..C:\s 00000273
testfiles\Formats\10-dir-list.txt : hit at offset 0x290
>466F6F42 616E6B5C 42617244 72697665< FooBank\BarDrive 00000290

Pour lister uniquement les noms de fichiers contenant des hits, ajoutez l'option -nodump. Cela ne produira pas le volet de résultats exacts que vous avez demandé, mais au moins vous verrez où se produisent vos motifs.

Si créer un fichier mypatterns.txt au format // pose un problème, vous pouvez produire le fichier à partir d'un fichier wordlist.txt tel que:

sfk filter wordlist.txt -form "/$col1/" +tofile mypatterns.txt

Merci pour la suggestion de Swiss File Knife et le bel exemple.
Metro Smurf

1

Grep est votre ami. Vous pouvez mettre les modèles à rechercher dans un fichier nommé patterns.txt, puis exécuter la procédure suivante:

grep -f patterns.txt -r * > ..\results.txt

Modifier:

Je viens de tomber sur un question sur grep-like choses disponibles dans Windows. La question et les réponses couvrent de nombreux outils et commandes autonomes, libres ou non, intégrés à, par exemple. Powershell.


Grep travaillerait probablement avec un peu de lutte des commutateurs. Merci pour la suggestion.
Metro Smurf

En fait, tous les commutateurs sont affichés. '-f nom_fichier' est la liste des modèles d'un fichier et '-r' est récursif. La sortie est très proche de ce que vous avez spécifié comme objectif. Patterns.txt doit avoir un motif par ligne.
jpe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.