2013-10-01 10 views
16

Próbuję następujące rekursywnie szukać plików kończących się w obu .py lub .py.server:regex mecz albo ciąg w linux „znaleźć” komenda

$ find -name "stub*.py(|\.server)" 

Jednak to nie działa.

Próbowałem odmiany takie jak:

$ find -name "stub*.(py|py\.server)" 

Oni nie działa.

Prosty find -name "*.py" działa, więc dlaczego to regex nie robi?

+0

Spróbuj 'find -name "stub * .py (\. serwer)?"' '-regex' – Vince

+3

Zastosowanie jeśli chcesz u se wyrażenie regularne: 'find. -regex '. */skrót. * \. \ (py \ | py \ .server \)' ' – falsetru

Odpowiedz

28

Powiedz:

find . \(-name "*.py" -o -name "*.py.server" \) 

Mówiąc więc spowodowałoby nazw plików pasujących *.py i *.py.server.

Od man find:

expr1 -o expr2 
      Or; expr2 is not evaluated if expr1 is true. 

EDIT: Jeśli chcesz określić regex, należy wybrać opcję -regex:

find . -type f -regex ".*\.\(py\|py\.server\)" 
+0

To działa! Wielkie dzięki i +1, ale dlaczego nie działają wyrażenia regularne? –

+0

Jeśli to działa, powinieneś zaakceptować odpowiedź. – Teudimundo

+0

mogę tylko przyjąć ją w ciągu 6 minut ... :) wciąż jestem ciekaw, wyrażeń regularnych –

5

Wyszukiwanie może zająć wzorca wyrażenia regularnego:

$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print 

Opcje:

-regex wzór

Nazwa pliku pasuje do wzoru wyrażenia regularnego. To jest dopasowanie na całej ścieżce, a nie wyszukiwanie. Na przykład, aby dopasować plik o nazwie ./fubar3', you can use the regular expression. * Pasek. " lub .*b.*3', but not f. * r3 '. Wyrażenia regularne rozumiane przez find są domyślnie Emacs Wyrażenia regularne, ale można to zmienić za pomocą opcji -regextype.

-print True;

wydrukuj pełną nazwę pliku na standardowym wyjściu, a następnie znak nowej linii. Jeśli podłączysz wynik wyszukiwania do innego programu i istnieje najmniejsza możliwość, że szukane przez ciebie pliki mogą zawierać znak nowej linii, powinieneś poważnie rozważyć użycie opcji -print0 zamiast -print. Zobacz sekcję NIESTUALNE FILENAMI, aby uzyskać informacje o tym, jak obsługiwane są niestandardowe znaki w nazwach plików.

typ -regextype

Zmienia składni wyrażeń regularnych rozumiane przez -regex i -iregex testów, które występują później linii poleceń. Obecnie zaimplementowane typy to emacs (jest to ustawienie domyślne), posix-awk, posix- basic, posix-egrep i posix-extended.

Jaśniejszy description lub opcje. Nie zapomnij, że wszystkie informacje można znaleźć, czytając man find lub info find.

4

znaleźć -name nie używa wyrażenia regularnego, oto wyciąg ze strony człowieka na Ubuntu 12.04

-name pattern 
       Base of file name (the path with the leading directories 
       removed) matches shell pattern pattern. The metacharacters 
       (`*', `?', and `[]') match a `.' at the start of the base name 
       (this is a change in findutils-4.2.2; see section STANDARDS CON‐ 
       FORMANCE below). To ignore a directory and the files under it, 
       use -prune; see an example in the description of -path. Braces 
       are not recognised as being special, despite the fact that some 
       shells including Bash imbue braces with a special meaning in 
       shell patterns. The filename matching is performed with the use 
       of the fnmatch(3) library function. Don't forget to enclose 
       the pattern in quotes in order to protect it from expansion by 
       the shell. 

Więc wzór, który -name trwa to raczej glob muszli, a nie w ogóle jak regexp

Gdybym chciał odnaleźć przez regexp zrobiłbym coś

find . -type f -print | egrep 'stub(\.py|\.server)' 
+2

Jest całkowicie błędne stwierdzenie, że * find nie używa wyrażenia regularnego * (podczas gdy prawdą jest, że * wzorzec, który przyjmuje '' -name'' jest bardziej podobny do globu powłoki *). –

+0

@JonasWielicki, dzięki za komentarz, naprawiłem to dla ciebie – Vorsprung