Grep wewnątrz wszystkich plików utworzonych w zakresie dat

Jestem na Ubuntu OS. Chcę grep słowo (powiedzmy XYZ) wewnątrz wszystkich plików dziennika, które są tworzone w zakresie dat od 28-may-2012 do 30-may-2012.

Jak to zrobić?

Author: Peter Mortensen, 2012-06-05

3 answers

Jest to nieco inne rozwiązanie niż rozwiązanie Banthara, ale będzie działać z wersjami find, które nie obsługują -newermt i pokazuje, jak używać polecenia xargs, które jest bardzo użytecznym narzędziem.

Możesz użyć polecenia find, aby zlokalizować pliki "określonego wieku". Znajdziesz tu wszystkie pliki zmodyfikowane od 5 do 10 dni temu:

 find /directory -type f -mtime -10 -mtime +5

Aby następnie wyszukać w tych plikach ciąg znaków:

 find /directory -type f -mtime -10 -mtime +5 -print0 |
   xargs -0 grep -l expression

Możesz również użyć przełącznika -exec, ale uważam xargs za bardziej czytelny (i to często będzie działać lepiej, zbyt, ale prawdopodobnie nie w tym przypadku).

(zauważ, że znacznik -0 pozwala tej komendzie operować na plikach z osadzonymi spacjami, takich jak this is my filename.)

Aktualizacja dla pytania w komentarzach

Gdy podasz wiele wyrażeń find, są one połączone razem. Na przykład, jeśli poprosisz o:

find . -name foo -size +10k

...find zwróci tylko pliki o nazwie (A) foo i B) większe niż 10 Kb. Podobnie, jeśli podajesz:

find . -mtime -10 -mtime +5

...find zwróci tylko pliki, które są (a) nowsze niż 10 dni temu i (B) starsze niż 5 dni temu.

Na przykład w moim systemie jest to obecnie:

$ date
Fri Aug 19 12:55:21 EDT 2016

Mam następujące pliki:

$ ls -l
total 0
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2
-rw-rw-r--. 1 lars lars 0 Aug  5 00:00 file3

Jeśli Poproszę o " pliki zmodyfikowane ponad 5 dni temu (-mtime +5) otrzymuję:

$ find . -mtime +5
./file3
./file2

Ale jeśli Poproszę o "pliki zmodyfikowane więcej niż 5 dni temu, ale mniej niż 10 dni temu" (-mtime +5 -mtime -10), dostaję:

$ find . -mtime +5 -mtime -10
./file2
 29
Author: larsks,
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-08-19 16:58:45

Połącz grep z Znajdź :

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;
 14
Author: Piotr Praszmo,
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
2012-06-05 13:45:48

find wydaje się, że nie ma opcji, w których można określić konkretne daty porównania znaczników czasu (przynajmniej wersja na moim laptopie nie - mogą być inne wersje i/lub inne narzędzia, które działają podobnie), więc będziesz musiał użyć liczby dni. Tak więc, od 2012/06/05, chcesz znaleźć pliki nowsze niż 9 dni, ale starsze niż 6 dni:

find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ
 -1
Author: twalberg,
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
2012-06-05 13:50:13