znajdź polecenie z kwantyfikatorem wyrażenia regularnego np. {1,2}

14

Próbowałem utworzyć ciąg polecenia find, który znajdzie wszystkie pliki, które kończą się cyframi 1-99, ale wykluczają wszystkie inne.

np. chcę znaleźć mój_plik1 mój_plik99, ale nie mój_plik456 i nie myfilebackup

Wyrażenie, o którym myślę, jest takie, myfile[1-9]{1,2}ale nie mogę zmusić go do pracy z funkcją find.

find . -regex '.*myfile[0-9]{1,2}' LUB find . -iname 'myfile[0-9]{1,2}'

Z tego, co widzę, jest to {1,2}część, która nie działa.

(a propos, czy można używać -name -regexzamiennie?)

Każda pomoc doceniona.

Lukas88
źródło
1
-iname(i -name) używaj globów , które nie mają tej składni.
l0b0

Odpowiedzi:

10

Możesz spróbować

find . -regex '.*myfile[0-9][0-9]?'

lub

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)
l0b0
źródło
Dzięki - pierwsza linia działa dla mnie. Próbowałem tego z opcją -iname, ale nie sądzę, że obsługuje ona składnię, bo robię coś złego.
Lukas88
17

Jeśli masz GNU find, możesz użyć innego typu wyrażenia regularnego:

find . -regextype sed -regex '.*myfile[0-9]\{1,2\}'

Zgodnie z GNU domyślnie findkorzysta z neutralnej składni wyrażeń regularnych Emacsa - Emacs obsługuje \{from,to\}składnię, ale przynajmniej GNU jej findnie obsługuje.

O dziwo, podręcznik referencyjny nie zawiera części dotyczącej sedskładni wyrażeń regularnych, więc kto wie, które części są obsługiwane.

l0b0
źródło
1
sedjak edwydaje się być aliasem posix-basic, więc powinny być zgodne z POSIX BRE (choć podpór Niektóre rozszerzenia takie jak \+). Nie jest kompatybilny z GNU, sedgdzie na przykład [\n]pasuje do nowej linii zamiast odwrotnego ukośnika lub jest nwymagany przez POSIX. Zobacz także -regextype posix-extendedPOSIX ERE (tak .*myfile[0-9]{1,2}), także z rozszerzeniami, takimi jak \slub\<
Stéphane Chazelas,
Nigdy nie wiedziałem o -regextype. Wydaje się, że jeśli -regextype egrepgo użyjesz , wydaje się, że możesz uniknąć odwrotnego ukośnika.
Sridhar Sarnobat,