Jak użyć polecenia * nix find, aby wyszukać określone pliki z wyrażeniem regularnym

1

W moim centOS jest wiele plików dziennika w moim folderze / dzienniku

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3
/log/log.20120308.error
/log/log.20120308.error.1

Widocznie, jeśli użyję polecenia jak poniżej

find /log -type f -iregex '.*/'log.20120308'.[0-9]*' -print

Dostanę tylko

/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Mam nadzieję, że mam odpowiednie wyrażenie regularne, aby uzyskać listę poniżej, ale nie powiodło się

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Nie mogłem znaleźć wyrażenia regularnego, aby wybrać rozszerzenie .1, .2, .3 lub puste

forestclown
źródło

Odpowiedzi:

3
find /log -type f -iregex '.*/'log.20120308'\(\.[0-9]*\)?' -print

? wskazuje jeden lub żaden, a powinieneś uciec przed kropką (przed [0-9], ponieważ kropka pasuje wszystko ), więc jeśli nie unikniesz kropki, również dostaniesz /log/log.20120308_1 w wyniku, jeśli ten plik istnieje.

Mengdi Gao
źródło
Podoba mi się także ta wersja. I zauważ, że możesz pominąć to ostatnie * jeśli masz tylko cyfry jednocyfrowe po . które chcesz znaleźć.
Lars Rohrbach
2

Jedna wersja:

find /log -type f -iregex '.*/'log.20120308'[.0-9]*' -print

Oczywiście wybrałoby to również plik, który został nazwany /log/log.20120308.., ale nie wyobrażam sobie, że byłby to prawdopodobny problem.

Innym sposobem byłoby użycie -o jako operator „lub”, z nawiasami po ucieczce wokół operandów:

find /log -type f \( -iregex '.*/'log.20120308'.[0-9]*' -o -iregex '.*/'log.20120308 \) -print

Och, jeszcze jedna aktualizacja do użytku -iregex: możesz po prostu nieco cytować '.*/log.20120308.[0-9]*' wybrałoby to samo co '.*/'log.20120308'.[0-9]*' Umieszczając to razem z sugestią @ md-gao, możesz uzyskać tę wersję:

find /log -type f -iregex '.*/log.20120308\(\.[0-9]\)?' -print
Lars Rohrbach
źródło