Find -exec nasıl çalıştırılır?


Yanıtlar:


710

Bir özledim ;( \;kabuğun yorumlamasını engellemek için buraya kaçtı ) veya a +ve a {}:

find . -exec grep chrome {} \;

veya

find . -exec grep chrome {} +

findyürütülür grepve {}bulunan dosya adları ile değiştirilir . Arasındaki fark ;ve +birlikte olmasıdır ;tek grepher dosya için komut ile oysa yürütülür +gibi birçok dosya olası parametre olarak verilir olarak greptek seferde.


30
\ Kullanırsanız; bitiş yapı grep bir defada bir dosya geçirilir, bu nedenle dosya adını varsayılan olarak göstermez, sadece eşleşen satırlar. Bunun yerine bir dosya listesi elde etmek için grep -lsfind yapısının içine bir kullanım ekleyin .
Caleb,

9
find . -exec grep foo {} +böyle çıktı gösterecektir./dir/file.py:from foo import bar
sg

10
find . -exec grep foo {} \;böyle çıktı gösterecektirfrom foo import bar
sg

9
find . -exec grep -l foo {} +böyle çıktı gösterecektir./dir/file.py
sg

8
find . -exec grep -l foo {} \;böyle çıktı gösterecektir./dir/file.py
sg

46

Bunun için hiç kullanmanıza gerek yok find; grep, dosyaları geçerli dizindeki her şeyin glob listesinden açmayı ele alabilir:

grep chrome *

... veya hatta klasör ve altındaki her şey için özyinelemeli:

grep chrome . -R

22
genişleme ARG_MAX üzerinde giderse, grep boğulur. -R herşeyi ziyaret ederken bir tanesini daha kolay ekler ekleyebilir, bazı dosyaları dışlamak (-name, vb.) Veya alt ağaçlara (-prune) bile giremezsiniz.
Mel

6
İyi puanlar @Mel. Benim açımdan, sormak istediğim taraf, işi findne zaman grepyapabileceğini söyleyerek olması gerekenden daha karmaşık hale getiriyordu , ancak bazı durumlarda dışarı çıkmadan önce dosya listesini incelemek için bul komutunu kullanmak daha etkili olacaktı. grep etmek
Caleb,

4
@ Mel grepbu durumda boğulmaz , execyapar.
Chris Down

Yalnızca tüm dosyalar, alt dizinlere yayıldığında değil, aynı dizinde olduğunda çalışır.
Yaba,

1
@Yaba Cevabım, alt dizinler üzerine yayılmış dosyaların nasıl ele alınacağını belirtir.
Caleb

18
find . | xargs grep 'chrome'

ayrıca şunları da yapabilirsiniz:

find . | xargs grep 'chrome' -ls

Birincisi dosyalardaki satırları gösterir, ikincisi sadece dosyaları listeler.

Caleb'in seçeneği daha düzenli, daha az tuşa basma.


11
Buradaki sorun xargs, girdilerinin, findüretilmeyen tuhaf bir şekilde alıntılanmasını beklemesidir . Öyleyse find … | xargs …, beyaz boşluk içeren dosya adlarınız varsa çalışmaz \'".
Gilles,

3
@Gilles find . | xargs -n1 -iX grep "X" 'chrome'Argümanları her defasında bir kez beslenerek ve alıntı yaparak bu sorunu çözebilirsiniz . Açıkçası bu, bu örneği ele almanın korkunç derecede yetersiz bir yoludur, ancak bazı durumlar için güzel.
Caleb,

Bütünlüğü sağlamak için 'grep' ile harf duyarsızlığı için -i seçeneğini de belirtmeliyiz. Ayrıca, büyük / küçük harfe duyarsızlığı bulmak için bir isim var.
Mathew

9
@Caleb: xargsLinux dosya adlarıyla baş etmenin tek% 100 güvenilir yolu, NUL'yi find ... -print0 | xargs -0ayırıcı olarak kullanmaktır. Alternatif - xargs -d '\n'ayırıcı olarak newline kullanarak,% 99 güvenilirlik.
Grawity

Bunu sık sık kullanırım, ancak çok uzun dosya isimleri listesi için başarısız olur, bu noktada find -exec kazanır.
Spacemoose


1

Satır yerine dosyaların listesini görmek için:

grep -l "chrome" *

veya:

grep -r -l "chrome" .

1

İşte genelde find / exec kullanmamın bir örneği:

find  . -name "*.py" -print -exec fgrep hello {} \;

Bu, yinelenerek tüm .py dosyalarını arar ve her dosya için dosya adını ve fgrep'leri bu (her biri için) dosyaya 'merhaba' için yazdırır. Çıktı gibi görünüyor (bugün sadece bir koştu):

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"

1
iş akışınızla uğraşmamaya çalışabilirsiniz, ancak beğenebilirsiniz: find . -name "*.py" -exec fgrep -l hello {} \; - eşleşen dosyaların dosya adlarını ve diğer hiçbir şeyi
basmayacaktır
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.