Nasıl öğrenebilirim dosyaları do geçerli dizinde değil kelimesini içeren foo
(kullanarak grep
)?
Nasıl öğrenebilirim dosyaları do geçerli dizinde değil kelimesini içeren foo
(kullanarak grep
)?
Yanıtlar:
Grep'inizde -L
(veya --files-without-match
) seçeneği varsa:
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)
-rL
-L
grep -L 'foo' -- *
Standart, uzun seçenekleri alan komutların, --
bu noktadan sonra başka seçenek olmadığını belirtmektir.
Bir göz atın ack
. .svn
Otomatik olarak sizin için dışlama yapar, Perl düzenli ifadeler verir ve tek bir Perl programının basit bir indirmesidir.
Aradığınız şeyin eşdeğeri aşağıdaki gibi olmalıdır ack
:
ack -L foo
Bunu sadece grep ile (bulmadan) yapabilirsiniz.
grep -riL "foo" .
Bu, üzerinde kullanılan parametrelerin açıklamasıdır. grep
-L, --files-without-match
each file processed.
-R, -r, --recursive
Recursively search subdirectories listed.
-i, --ignore-case
Perform case insensitive matching.
Eğer kullanırsanız l
tam tersini alacak (küçük harfli) (maçlarla dosyalar)
-l, --files-with-matches
Only the names of files containing selected lines are written
Aşağıdaki komut bana kalıbı içermeyen tüm dosyaları verir foo
:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
grep '0$'
dosyaları 10 satırın katlarıyla eşleştirebilir! grep ':0$'
Sonunda, satırın sonunda açık bir ': 0' olup olmadığını kontrol etmeniz gerekir . O zaman sadece sıfır satır eşleşen dosyaları alırsınız.
Aşağıdaki komut, bulucunun svn
bir saniye kullanarak klasörleri filtrelemesini gerektirmez grep
.
grep -rL "foo" ./* | grep -v "\.svn"
Aslında ihtiyacınız olacak:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
Sorun
.phtml
Satır içi PHP kodu kullanarak HTML yazmak için dosyaları kullanan büyük bir proje refactor gerekir . Bunun yerine Bıyık şablonlarını kullanmak istiyorum . Bu hala yeniden yazılması gerekir gibi .phtml
dize içermeyen herhangi bir giles bulmak istiyorum new Mustache
.
Çözüm
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
açıklama
Borulardan önce:
bulmak
find .
Bu dizinden başlayarak dosyaları yinelemeli olarak bulun
-iname '*.phtml'
Dosya adı içermelidir .phtml
( i
büyük / küçük harfe duyarlı değildir)
-exec 'grep -H -E -o -c 'new Mustache' {}'
grep
Eşleşen yolların her birinde komutu çalıştırın
grep
-H
Dosya adı başlıklarını her zaman çıktı satırlarıyla yazdırın.
-E
Deseni genişletilmiş düzenli bir ifade olarak yorumlar (yani grep'i egrep gibi davranmaya zorlar).
-o
Çizgilerin yalnızca eşleşen kısmını yazdırır.
-c
Standart çıktıya yalnızca seçili satır sayısı yazılır.
Bu .phtml
, dizenin new Mustache
her birinde kaç kez oluştuğunu sayarak, biten tüm dosya yollarının bir listesini verecektir .
$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
İlk boru, grep :0$
bu listeyi yalnızca ile biten satırları içerecek şekilde filtreler :0
:
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
İkinci boru sed 's/..$//'
her satırın son iki karakterini sıyırıp sadece dosya yollarını bırakır.
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml
Grep'imin herhangi bir -L seçeneği yok. Bunu başarmak için geçici bir çözüm buluyorum.
Fikirler:
diff komutu ile 2 döküm dosyası arasındaki farkı oluşturabilir.
grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
grep * *.log | cut -c1-14 | uniq > txt2.txt
diff txt1.txt txt2.txt | grep ">"
diff
iki çıkış akışı arasında bir komut yapabilirsiniz (komutları parantezle çevrelendiğinizi ve orada da bir yerlerde bir köşeli parantez olduğunu düşünüyorum), eğer sistemleriniz destekliyorsa, sanırım soru, desteklemediği içingrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Filtreyi "find" altında ve hariç tutma dizesini "grep -vwE" altında belirtebilirsiniz. Değiştirilmiş süreye de filtre uygulamanız gerekip gerekmediğini bulmak için mtime öğesini kullanın.
@Tukan tarafından yorumlandığı gibi, Ag için -L
/ --files-without-matches
flag ile ilgili bir açık hata raporu var :
Hata raporunda çok az ilerleme olduğu için, hatanın çözülmediği sürece -L
aşağıda belirtilen seçeneğe güvenilmemelidir . Bunun yerine bu konuda sunulan farklı yaklaşımları kullanın. Hata raporu için bir açıklamada bulunmak [benimki vurgu]:
Bu konuda herhangi bir güncelleme var mı?
-L
dosyanın ilk satırındaki eşleşmeleri tamamen yok sayar. Bu, yakında düzeltilmeyecekse, etkin bir şekilde reklamı yapılan şekilde çalışmadığı için bayrak tamamen kaldırılmalıdır .
Güçlü bir alternatif olarak grep
, The Silver Searcher - Ag'yi kullanabilirsiniz :
Hız odaklı, ack benzeri bir kod arama aracı.
Baktığımızda man ag
, -L
veya --files-without-matches
seçeneğini buluyoruz :
... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches.
Yani, geçerli dizinden eşleşmeyen dosyaları özyinelemeli olarak aramak için foo
:
ag -L foo
Yalnızca geçerli dizinde eşleşmeyen dosyaları aramak için özyineleme için foo
belirtmeniz yeterlidir --depth=0
:
ag -L foo --depth 0
-L
hata nedeniyle zaman zaman başarısız olur - github.com/ggreer/the_silver_searcher/issues/238
grep -irnw "filepath" -ve "pattern"
veya
grep -ve "pattern" < file
Yukarıdaki komut bize -v, aranan desenin tersini bulduğu için sonuç verecektir.
-l
dosya adını yazdırma seçeneğini ekleyebilirsiniz ; ancak bu , kalıbı içermeyen herhangi bir satır içeren herhangi bir dosyanın adını yazdırmaya devam eder. Ben OP desen içeren herhangi bir satır içermeyen dosyaları bulmak istediğine inanıyorum.
Aşağıdaki komut, "foo" alt dizesini içeren satırları filtrelemenize yardımcı olabilir.
cat file | grep -v "foo"
cat
.