Lista nazw plików na podstawie wzorca nazwy pliku i zawartości pliku-GREP?

Jak mogę użyć polecenia Grep do przeszukiwania file name na podstawie dzikiej karty "LMN2011*" z listą wszystkich plików z tym jako początku?

Chcę jeszcze raz sprawdzić zawartość tych plików.

If file content has some thing like

LMN20113456

Czy mogę użyć GREP do tego?

Grep -ls "LMN2011*"   "LMN20113456"

Jaki jest właściwy sposób przeszukiwania nazw plików i ich zawartości za pomocą poleceń powłoki?

Author: KatieK, 2011-05-06

5 answers

Grep nie używa "wildcards" do wyszukiwania – to shell globbing, jak *..jpg Grep używa "wyrażeń regularnych" do dopasowywania wzorców. Podczas gdy w powłoce ' * 'oznacza " cokolwiek", w grep oznacza "dopasuj poprzedni element zero lub więcej razy".

Więcej informacji i przykłady tutaj: http://www.regular-expressions.info/reference.html

Aby odpowiedzieć na twoje pytanie - możesz znaleźć pliki pasujące do jakiegoś wzorca z grep:

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

Następnie możesz przeszukać ich zawartość (wielkość liter):

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

Jeśli ścieżki mogą zawierać spacje, należy użyć funkcji "zero end":

find /somedir -type f -print0 | grep -iz 'LMN2011' | xargs -0 grep -i 'LMN20113456'
 55
Author: jm666,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 16:10:28

Można to zrobić również bez find, używając opcji grepa "--include".

Strona man Grep mówi:

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

Aby więc wykonać rekurencyjne wyszukiwanie ciągu znaków w pliku pasującym do określonego wzorca, będzie to wyglądało mniej więcej tak:

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

Na przykład, aby rekurencyjnie wyszukać ciąg znaków "mytarget" we wszystkich plikach Makefile:

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

Lub wyszukiwanie we wszystkich plikach zaczynających się od "Make" w nazwie pliku:

grep -r --include="Make*" "mytarget" ./
 24
Author: Jahanzeb Farooq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 08:58:50
grep LMN20113456 LMN2011*

Lub jeśli chcesz przeszukiwać rekurencyjnie podkatalogi:

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \;
 7
Author: Aoife,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-06 16:39:06

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

 0
Author: ugnelakys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 13:16:22

Załóżmy, że pliki są wewnątrz /home/me, ale pomijamy cokolwiek w /home/me/temp lub poniżej:

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'
 0
Author: ohho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 08:29:14