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?
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'
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" ./
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 {} \;
find/folder -type f -mtime -90 | grep -E "(.txt | .php | .inc | .root | .gif)" | xargs ls -l> WWWlastActivity.log
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'