Mam kilka obrazów o nazwach z wygenerowanym ciągiem uuid1. Na przykład 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Chcę znaleźć wszystkie te obrazy za pomocą polecenia „znajdź”:
find . -regex "[a-f0-9\-]\{36\}\.jpg".
Ale to nie działa. Coś nie tak z wyrażeniem regularnym? Czy ktoś mógłby mi w tym pomóc?
Odpowiedzi:
Pamiętaj, że musisz określić
.*/
na początku, ponieważfind
pasuje do całej ścieżki.Przykład:
Moja wersja find:
źródło
"^ ... $"
otoczenie wyrażenia regularnego. Musi pasować do CAŁEJ linii wynikowej./
w.*/
ponieważ.*
dopasowuje zero lub więcej (prawie) dowolnego znaku.\{36\}
valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
-regextype
flagę przed tym-regex
flagi, inaczej to nie ma zastosowania!-regex
Wyrażenie find dopasowuje całą nazwę , włączając względną ścieżkę z bieżącego katalogu. Dofind .
tego zawsze zaczyna się od./
, a następnie katalogów.Są to również
emacs
wyrażenia regularne, które mają inne reguły ucieczki niż zwykłe wyrażenia regularne egrep.Jeśli wszystkie znajdują się bezpośrednio w bieżącym katalogu, to
powinno działać. (Nie jestem do końca pewien - nie mogę uruchomić liczonego powtórzenia). Możesz przełączyć się na wyrażenia egrep poprzez
-regextype posix-egrep
:(Zauważ, że wszystko, co tu powiedziano, dotyczy GNU find, nie wiem nic o BSD, który jest również domyślny na Macu.)
źródło
posix-egrep
typ działał dla mnie.-regextype
jest opcją dla GNU,find
a nie BSD (przynajmniej nie podobną do Mac BSD)find
. Jeśli ta opcja nie jest dostępna, zainstaluj GNU find. Jeśli na komputerze Mac jest to możliwe dzięki pakietowi naparufindutils
. Znajdź jest wtedy dostępne za pośrednictwemgfind
.Sądząc z innych odpowiedzi, wydaje się, że może to być wina znaleziska.
Możesz jednak zrobić to w ten sposób:
find . * | grep -P "[a-f0-9\-]{36}\.jpg"
Być może będziesz musiał trochę ulepszyć grep i użyć różnych opcji w zależności od tego, co chcesz, ale działa.
źródło
find
„s-prune
funkcjonalność, która będzie przeskoczyć pewnych katalogów całkowicie. Najczęściej nie jest to tak naprawdę ważne, ale warto o tym wspomnieć.w systemie Mac OS X (wyszukiwanie BSD) : Taki sam jak zaakceptowana odpowiedź,
.*/
prefiks jest potrzebny, aby dopasować pełną ścieżkę:man find
mówi-E
korzysta z rozszerzonej obsługi wyrażeń regularnychźródło
-E
się, że nie jest dostępny na Ubuntu (testowany na WSL Ubuntu)Spróbuj użyć pojedynczych cudzysłowów ('), aby uniknąć ucieczki powłoki z łańcucha. Pamiętaj, że wyrażenie musi pasować do całej ścieżki, tzn. Musi wyglądać następująco:
Poza tym wydaje się, że moje znalezisko (GNU 4.4.2) zna tylko podstawowe wyrażenia regularne, a zwłaszcza składnię {36}. Myślę, że musisz się bez tego obejść.
źródło
Prosty sposób - możesz określić. * Na początku, ponieważ find pasuje do całej ścieżki.
znajdź wersję
źródło
Podczas stosowania instrukcji find z wyrażeniem regularnym należy użyć bezwzględnej ścieżki do katalogu. W twoim przykładzie
należy zmienić na
W większości systemów Linux niektóre dyscypliny wyrażenia regularnego nie mogą być rozpoznane przez ten system, więc musisz wyraźnie wskazać na wyrażenia regularne, takie jak
źródło