Dosyaları "chrome" metnini içeren geçerli dizinde bulmak istiyorum.
$ find . -exec grep chrome
find: missing argument to `-exec'
Neyi yanlış yapıyorum?
find: Only one instance of {} is supported with -exec ... +
-execilefind
Dosyaları "chrome" metnini içeren geçerli dizinde bulmak istiyorum.
$ find . -exec grep chrome
find: missing argument to `-exec'
Neyi yanlış yapıyorum?
find: Only one instance of {} is supported with -exec ... +
-execilefind
Yanıtlar:
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.
grep -lsfind yapısının içine bir kullanım ekleyin .
find . -exec grep foo {} +böyle çıktı gösterecektir./dir/file.py:from foo import bar
find . -exec grep foo {} \;böyle çıktı gösterecektirfrom foo import bar
find . -exec grep -l foo {} +böyle çıktı gösterecektir./dir/file.py
find . -exec grep -l foo {} \;böyle çıktı gösterecektir./dir/file.py
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
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
grepbu durumda boğulmaz , execyapar.
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.
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 \'".
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.
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.
Bul bir yoludur ve the_silver_searchersonra tek yapmanız gereken deneyebilirsiniz
ag chrome
Tüm dosyalarda chrome arar (alt dizinleri içerir) ve bulmasından daha hızlıdır
Satır yerine dosyaların listesini görmek için:
grep -l "chrome" *
veya:
grep -r -l "chrome" .
İş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"
find . -name "*.py" -exec fgrep -l hello {} \; - eşleşen dosyaların dosya adlarını ve diğer hiçbir şeyi