Regex'i find komutuyla nasıl kullanabilirim?


298

Oluşturulan uuid1 dizesi ile adlandırılan bazı görüntüler var. Örneğin 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Tüm bu görüntüleri "find" komutunu kullanarak bulmak istiyorum:

find . -regex "[a-f0-9\-]\{36\}\.jpg".

Ama işe yaramıyor. Normal ifadeyle ilgili bir sorun mu var? Birisi bana bu konuda yardımcı olabilir mi?


7
belki normal ifadeyi değiştirebilir. Varsayılan değer ne olursa olsun Emacs Normal İfadeleridir .
pavium

Yanıtlar:


350
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

Tüm yolla eşleştiği için .*/başlangıçta belirtmeniz gerektiğini unutmayın find.

Misal:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

Bulmamın sürümü:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

4
@Tom, bulma işlerinde regex'in yolu. Man sayfasına göre, normal ifade, dizinler dahil olmak üzere tüm dosya yoluyla eşleşir; bu "^ ... $", normal ifadenizi çevreleyen bir örtük var demektir . TÜM sonuç satırıyla eşleşmelidir.
Manny D

2
Sana ihtiyacım olduğunu sanmıyorum /içinde .*/çünkü .*maçlar sıfır ya da (neredeyse) herhangi bir karakterin daha fazlası.
Jeff

2
Regex'i ilk kez düzgün okumamış olanlar için (benim gibi): Özel regex karakterlerinden önceki ters eğik çizgilere dikkat edin, örneğin:\{36\}
Lucas Wilson-Richter

11
Normal ifade türlerinin tam listesini bulmakta zorlandım (manpage güncel değil):valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
Noah Sussman

4
Koymak emin olun -regextypebayrağı önce-regex aksi takdirde geçerli değildir, bayrak!
Christopher Orr

84

-regexBulmak ifadesi ile eşleşen tüm adı geçerli dizinden göreli yol da dahil olmak üzere. Bunun için find .her zaman ./, daha sonra herhangi bir dizin ile başlar .

Ayrıca, bunlar emacsnormal egrep düzenli ifadelerinden başka kaçan kurallara sahip düzenli ifadelerdir.

Bunların tümü doğrudan geçerli dizinde bulunuyorsa,

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

çalışmalı. (Gerçekten emin değilim - burada tekrarlanan sayılan tekrarını alamıyorum.) Egrep ifadelerine şu yolla geçebilirsiniz -regextype posix-egrep:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(Burada söylenen her şeyin GNU bulması için olduğunu, Mac'te de varsayılan olan BSD hakkında hiçbir şey bilmiyorum.)


1
Benim regex birden çok eşleşen dizeleri için parantez vardı, bu yüzden posix-egreptürü benim için çalıştı.
Ocak'ta palswim

2
Dikkat edilmesi gereken bir şey, BSD -regextypeiçin finddeğil, en azından Mac BSD benzeri değil , GNU için bir seçenektir find. Bu seçenek kullanılamıyorsa, GNU find'ı yüklediğinizden emin olun. Mac'te demlemek için bu mümkün findutils. Daha sonra Bul öğesine erişilebilir gfind.
DanCat

görevi regextype posix-egrep benim için yaptı. Bence varsayılan regextype emacs.
1919'da

35

Diğer cevaplara bakılırsa, bu bulgunun hatası olabilir.

Ancak bunu şu şekilde yapabilirsiniz:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

Grep'i biraz ayarlamanız ve ne istediğinize bağlı olarak farklı seçenekler kullanmanız gerekebilir, ancak çalışır.


Benim için iyi çalıştı ve normal ifade konusunda büyük bir özgürlük sağlıyor.
glaucon

3
Bu sahip bir olumsuz yararlanmak edemezler findbireyin -prunetamamen belli dizin üzerine atlayacak işlevsellik. Çoğu zaman bu gerçekten önemli değildir, ancak söz etmeye değer.
Alexander Bird

- kuru erik hala işe yarayacak sanırım. -Exec kullanmak daha tehlikeli olurdu - sadece grep'in geçmesine izin verenler değil, tüm dosyalarda çalışır.
tpb261

13

Mac OS X'te (BSD bul) : Kabul edilen yanıtla aynı şekilde, .*/ön ekin tam bir yolla eşleşmesi gerekir:

$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"

man finddiyor ki -Enormal regex desteği kullanıyor


Görünüşe göre -EUbuntu'da mevcut değil (WSL Ubuntu üzerinde test edildi)
Warlike Chimpanzee

2
@Clever Little Monkey - Hayır, kabul edilen cevap Ubuntu üzerinde çalışmalı, bu varyasyon özellikle Mac OS X için (veya belki de FreeBSD gibi başka bir BSD varyantı)
Stan Kurdziel

8

Dizenizden kabuk kaçmasını önlemek için tek tırnak (') kullanmaya çalışın. İfadenin tüm yolla eşleşmesi gerektiğini, yani şöyle görünmesi gerektiğini unutmayın:

 find . -regex '\./[a-f0-9-]*.jpg'

Bunun dışında bulgum (GNU 4.4.2) sadece temel düzenli ifadeleri biliyor, özellikle de {36} sözdizimini bilmiyor. Bence onsuz yapman gerekecek.


8

Basit yol - başlangıçta. * Belirtebilirsiniz çünkü find tüm yolla eşleşir.

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

sürümü bul

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)

6

Normal ifadeli find komutunu uygularken mutlak dizin yolu kullanmalısınız. Örneğinizde,

find . -regex "[a-f0-9\-]\{36\}\.jpg"

olarak değiştirilmeli

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

Çoğu Linux sisteminde, normal ifadedeki bazı disiplinler bu sistem tarafından tanınamaz, bu nedenle -regexty gibi

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.