2011-07-19 34 views
13

Linux'da find komutunu kullanırken, eşleşen emacs regualr ifadelerini kullanan bir -regex bayrağı ekleyebilirsiniz.fileetypes'i dışlamak için düzenli ifade

.jar dosyaları ve .ear dosyaları hariç tüm dosyaları aramak istiyorum. Bu durumda normal ifade ne olurdu?

Teşekkür

cevap

28

Burada bir düzenli ifadeye ihtiyacınız yok. Sen -name ve -not seçenekleri ile find kullanabilirsiniz:

find . -not -name "*.jar" -not -name "*.ear" 

Daha özlü (ama daha az okunabilir) Yukarıdaki sürümüdür: Bu durumda normal ifade kullanma

find . ! \(-name "*.jar" -o -name "*.ear" \) 
+1

+1, daha okunaklı olduğu için bunu önermek üzereydi. – carlpett

+0

Katılıyorum, regex muhtemelen aşırı olacaktı. –

+0

haklısın, ama bunu bir işlev olarak kullanıyorum ve son kullanıcının gereksinimleri ne olacağını bilmediğim için mümkün olduğunca jenerik yapmaya çalışıyorum. – Michael

11

DÜZENLEME: Yeni yaklaşım:

find . -not -regex ".*\.[je]ar" 

önceden yayınlanmıştır cevap Geriye İlerleme kullanır ve böylece: POSIX regexes çevre bakışına desteklemez olduğundan, maç sonucu etkisiz hale getirmesine gerek

Burada çalışmaz, ama işte tamlık için:

.*(?<!\.[je]ar)$ 
+0

, bu komutta çalışmasını sağlayamıyor gibi görünüyor. buluyorum. -type 'f' -regextype posix-extended -regex '. * (? Michael

+0

'regex' seçeneğinden sonra 'regextype' seçeneğini yerleştirmeniz gerektiği gibi geliyor. Fakat 'posix-genişletilmiş' doğru gelmiyor; POSIX'in AFAIK görünümü yok. –

+0

Oops. 'Bul', sadece POSIX BRE/ERE motorlarını destekliyor gibi görünüyor. Bu durumda, bu çözüm hiç işe yaramayacak. Bunun için üzgünüm (bunu kim söyledi?) ... –

0

bir overkill gibi geliyor (ismin bir şeyle bitip bitmediğini kontrol edebilirsiniz). Ben emacs sözdizimi hakkında emin değilim, ama böyle bir şey çalışmak için genel olmalıdır:

\.(?!((jar$)|(ear$))) 

yani bir nokta bulmak ($) "kavanoz" veya biten izledi değil (|) "kulak (.) ".

+0

Ve dosya adı bir nokta içermiyorsa ne olur? Ya da birden fazla nokta? ('-regex' seçeneğinin dışında, sadece bir parçası değil, tüm dosya adıyla eşleşir) –

4
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)" 

Bu, işi yapacak ve kişisel olarak diğer çözümlerden biraz daha açık bir şekilde buluyorum. Ne yazık ki, yakalama grubunun çalışmasını sağlamak için -rextxtype (başka türlü basit bir komutu karıştırmak) gerekir.