2016-03-26 32 views
2

Belirli regex desenlerikaçının

bir örnek var eşleşecek arama bulmak dizinleri hariç tutabilir bash herhangi bir araç olup olmadığını bilmek istiyorum:

  • ./dokuments
  • ./dokuments/1.txt
  • ./dokuments/files/2.txt
  • ./documentsz/message.doc

Komut dizimi çalıştırdığımda (bu temelde dizinleri araştırır ve içeriğiyle ilgili bir rapor oluşturur) bu regex "ents $" ile - sonuç yalnızca ..documentsz içinde olan message.doc olmalıdır. diğer dosyalar.

Bulduğum birçok çözüm gördüm. -not -name, -regextype posix-egrep -regex, ama benim için işe yaramaz, çünkü önceden düzenli ifadeyi bilmiyorum, hangi dizinin (regex ile eşleşen) ismini kullanacağını bilmiyorum.

+0

Olası yinelenen [find dizini hariç tutun. komutu] (http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command) –

+0

Evet bunu okudum, ama benim için çalışmaz, çünkü regex'in ne olacağını bilmiyorum Kullanılmalıdır. Önceden ayrılmış dizinin spesifik ismini önceden bile bilmiyorum. –

+0

Lütfen özel sorununuza açıklık getirin veya tam olarak neye ihtiyacınız olduğunu vurgulamak için ek ayrıntılar ekleyin. – Cyrus

cevap

0

ctrlv.cz paste ürününüzün ne çıkmasını beklediğinizden emin değilim. Regex aşağıdaki gibidir:

Dizenin sonunda enty içermeyen hiçbir şey çıktısı alın.

enry içinde biten bir dizinde bulunan her dosyayı hariç tutmak ister misiniz? Sonra,

find . -not \(-path "*enry" -prune \) -o -type f 

dinamik regex istiyorsanız ve bunun yerine tam yolunu her dizin/dosya eşleştirmek istiyorum: Eğer durum buysa

find . -type f | grep -v 'enry/' 

o zaman yapayalnız bulmak kullanabilirsiniz kullanabilirsiniz:

my_script.sh (ı üretimde kodu bu kullanmayı demiyorum)

Veya AWK ile

#!/usr/bin/env bash 
find -type f -print0 | perl -na0 -F/ -e 'print "$_\n" unless grep { /'"$1"'/ } @F' 
:

find -type f | awk -F/ '{for(i=1;i<=NR;i++)if ($i ~ /'"$1"'/) next}1' 

Kullanımı: ait

$ bash my_script.sh "enry$" 
./dirstat.sh 
./dirstat.sh.save 
... 
./pokus/pokus 
./a.out 
+0

Orada söylediğim gibi, önceden regex bilmiyorum, her regex ile çalışmalıdır, bu yüzden kullanıcı regex '^ doku' olarak koyarken her dosya ve dizini (ve içindeki dosyaları) yok saymalıdır. Bu regex ile eşleşir ve araştırılırken direk olarak yazdırılır, Kullanıcı regex '* dok *' olarak koyarsa aynı şekilde çalışmalıdır –

+0

Çalışıyor gibi görünüyor, cevaplarınız için teşekkürler, kullanamıyorum Bu, çünkü taşınabilirlik ile ilgili bir sorun olurdu, (ve benim için en azından benim için karmaşık) zaten komutun tek tek bileşenlerinin ne yaptığını bilmek güzel olurdu. –

+0

Temelde her çizgiyi eğik çizgi üzerinde bölüyorum ve – andlrc

İlgili konular