web-dev-qa-db-fra.com

Liste des noms de fichiers basés sur un motif de nom de fichier et le contenu du fichier?

Comment utiliser la commande Grep pour rechercher file name en fonction d'un caractère générique "LMN2011*" répertoriant tous les fichiers dont le nom commence?

Je veux ajouter une autre vérification sur le contenu de ces fichiers. 

Si file content a quelque chose comme 

LMN20113456

Puis-je utiliser GREP pour cela?

Grep -ls "LMN2011*"   "LMN20113456"

Quelle est la manière appropriée de rechercher les noms de fichiers et son contenu à l'aide des commandes Shell?

34
zod

Grep N'UTILISE PAS les "caractères génériques" pour la recherche - il s'agit de Shell globbing, comme * .jpg . Grep utilise des "expressions régulières" pour la correspondance des modèles. Alors que dans le shell '*' signifie "n'importe quoi", dans grep cela signifie "correspond au point précédent zéro fois ou plus".

Plus d'informations et des exemples ici: http://www.regular-expressions.info/reference.html

Pour répondre à votre question - vous pouvez trouver des fichiers correspondant à certains modèles avec grep:

find /somedir -type f -print | grep 'LMN2011' # that will show files whose names contain LMN2011

Ensuite, vous pouvez rechercher leur contenu (insensible à la casse):

find /somedir -type f -print | grep -i 'LMN2011' | xargs grep -i 'LMN20113456'

Si les chemins peuvent contenir des espaces, vous devez utiliser la fonctionnalité "zéro fin":

find /somedir -type f -print0 | grep -iz 'LMN2011' | xargs -0 grep -i 'LMN20113456'
55
jm666

Cela peut aussi être fait sans find en utilisant l'option "--include" de grep.

la page de manuel de grep dit:

--include=GLOB
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).

Donc, pour faire une recherche récursive d'une chaîne dans un fichier correspondant à un modèle spécifique, cela ressemblera à ceci:

grep -r --include=<pattern> <string> <directory>

Par exemple, pour rechercher de manière récursive la chaîne "mytarget" dans tous les Makefiles:

grep -r --include="Makefile" "mytarget" ./

Ou pour rechercher dans tous les fichiers commençant par "Make" dans le nom du fichier:

grep -r --include="Make*" "mytarget" ./
24
Jahanzeb Farooq
grep LMN20113456 LMN2011*

ou si vous souhaitez effectuer une recherche récursive dans les sous-répertoires:

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \;
7
Aoife

find/folder -type f -mtime -90 | grep -E "(.txt | .php | .inc | .root | .gif)" | xargs ls -l> WWWlastActivity.log

0
ugnelakys

Supposons que les fichiers LMN2011* se trouvent à l'intérieur de /home/me mais ignorent quoi que ce soit dans /home/me/temp ou ci-dessous:

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'
0
ohho