Ben yapıyorum findve sonra dosyaların bir listesini almak. Nasıl cat(cat tüm bu dosyaların içeriğini görüntüler) gibi başka bir yardımcı programa nasıl boru ve temelde grepbu dosyalardan bir şey gerekir .
Ben yapıyorum findve sonra dosyaların bir listesini almak. Nasıl cat(cat tüm bu dosyaların içeriğini görüntüler) gibi başka bir yardımcı programa nasıl boru ve temelde grepbu dosyalardan bir şey gerekir .
Yanıtlar:
Başka bir sürece borulama (Bu, yapmaya çalıştığınızı söylediklerinizi yerine getirmeyecek olsa da):
command1 | command2
Bu, command1 çıktısını command2 girişi olarak gönderir
-execüzerinde find(bu, yapmak istediğiniz şeyi yapacak - ancak spesifik olan find)
find . -name '*.foo' -exec cat {} \;
(Her şey arasında findve -execzaten kullandığınız bulmak yüklemleri vardır. {}Eğer komuta içine bulundu belirli dosya (yerine yerleştirir cat {}bu durumda); \;bitmesini olan -execkomutu.)
bir işlemin çıktısını başka bir işleme komut satırı bağımsız değişkenleri olarak gönderme
command2 `command1`
Örneğin:
cat `find . -name '*.foo' -print`
(Bu GERİ-KEŞİF benim klavyede tildeli ~ altında düzenli tırnak () olduğunu unutmayın.) Bu çıktısını gönderir command1içine command2komut satırı bağımsız değişkenleri olarak. Yine de boşluk içeren dosya adlarının (satırsonu vb.) Ayrı bağımsız değişkenlere bölüneceğini unutmayın.
findyazmanıza izin verdiğini unutmayın : find . -name '*.foo' -exec cat {} +Burada, tek bir komut çağrısında uygun sayıda dosya adını gruplaması gerektiğini +belirtir find. Bu oldukça kullanışlıdır (dosya adlarında boşluklar vb. İle başvurmadan ilgilenir -print0ve xargs -0).
find . -name '*.foo' | xargs cat
find . -name '*.foo' | xargs cat | grep string
POSIX 2008, +işaretleyiciyi ekledi; findbu, artık makul olduğu kadar çok dosyayı tek bir komut yürütmesinde otomatik olarak gruplandırdığı anlamına geliyor, tıpkı xargsbir çok avantajla:
Dosya adı sorunu ile ilgili bir sorun olduğunu xargsolmadan -0seçeneği ve konuya 'hatta sıfır dosya adları ile çalıştırmak' olan veya olmayan bir sorun olduğunu -0seçenek - ama GNU xargsvardır -rya --no-run-if-emptyonun için ona karşı seçeneğine. Ayrıca, bu gösterim, performans farkını ölçmeniz muhtemel değil, süreç sayısını azaltır. Bu nedenle, mantıklı olarak şunları yazabilirsiniz:
find . -exec grep something {} +
find . -print | xargs grep something
Linux üzerinde konum veya GNU varsa findve xargskomutları, daha sonra kullanmak -print0ile findve -0ile xargsboşluk ve diğer garip top karakter içeren tanıtıcı dosya adlarına.
find . -print0 | xargs -0 grep something
grepDosya adlarını (yalnızca metin) istemiyorsanız, uygun bir seçenek ekleyin grep(genellikle -h'başlıkları' bastırmak için). Kesinlikle dosya adı ile yazdırılır garanti etmek için grep(sadece bir dosya bulunursa veya son çağırma bile grepsadece 1 dosya adı verilir), sonra eklemek /dev/nulliçin xargsdaima en az iki dosya adları olacak böylece, komut satırından.
xargs grep something.
findstandart girişine eklenir xargs. xargsProgram boşluk en (boşluk, yeni satır sekme, vs) girişi bölme, standart okur ve komuta sözcük sayısını ekler grep somethingve komut hattı yürütür. xargsdaha sonra giriş okumaya ve giriş bitene kadar komutları yürütmeye devam eder. komutu verilen girdi için gerektiği sıklıkta xargsçalıştırır grep( findbu örnekte).
/dev/nullHata mesajlarını kaybetmek için stderr yönlendiriliyor .
Teknik olarak hepsi piping kullanmasa da find, catkomut tarafından döndürülen dosyaların listesini komuta iletmenin birkaç yolu vardır ve hiçbiri doğrudan doğrudan boru oluşturmaz cat.
En basiti backticks ( `) kullanmaktır :
cat `find [whatever]`
Bu, çıktısını alır findve etkin bir şekilde komut satırına yerleştirir cat. findÇok fazla çıktı (bir komut satırına sığabileceğinden daha fazla) veya çıktıda özel karakterler (boşluklar gibi) varsa bu işe yaramaz .
Aşağıdakiler de dahil olmak üzere bazı kabuklarda, ters çentikler yerine bashkullanılabilir $():
cat $(find [whatever])
Bu daha az taşınabilir, ancak tartışılabilir. Bunun yanı sıra, geri tepmelerle hemen hemen aynı uyarılara sahiptir.
Bulunan şeyde başka komutlar çalıştırmak yaygın bir kullanım olduğundan find, find, -execbulduğu her dosya için bir komut yürüten bir eyleme sahiptir:
find [whatever] -exec cat {} \;
{}Dosya için bir yer tutucudur ve \;komuta uç işaretleri (Mümkün sonra diğer işlemler olur -exec.)
Bu, verimsiz olabilen ve bazı komutlar için istediğiniz davranışlara sahip olmayabilecek birden fazla dosya adını geçirmenin cattek bir örneğini çalıştırmak yerine her bir dosya için bir kez çalışır cat(iyi olsa da cat). Sözdizimi de yazmak için gariptir - noktalı virgülten kaçmanız gerekir çünkü noktalı virgül kabuğa özeldir!
Bazı sürümleri find(özellikle GNU sürümü) ;, +aşağıdakilerin -execdaha az örneğini çalıştırmak için 'ekleme' modunu kullanmanıza izin verir cat:
find [whatever] -exec cat {} +
Bu, her çağrı için birden fazla dosya adı geçirecektir cat, bu da daha verimli olabilir.
Ancak bunun tek bir çağrı kullanacağının garanti edilmediğini unutmayın . Komut satırı çok uzun olursa, argümanlar birden çok çağrısına yayılır cat. İçin catbu muhtemelen büyük bir anlaşma değil, ama diğer bazı komutlar için bu istenmeyen şekilde davranışını değiştirebilir. Linux sistemlerinde, komut satırı uzunluk sınırı oldukça büyüktür, bu nedenle birden fazla çağrmaya bölünmek diğer bazı işletim sistemlerine kıyasla oldukça nadirdir.
Klasik / taşınabilir yaklaşım xargsşunları kullanmaktır :
find [whatever] | xargs cat
xargsbelirtilen komutu çalıştırır ( catbu örnekte) ve stdin'den okuduklarına göre argümanlar ekler. Gibi sadece -execile +gerekirse bu komut satırı yukarı kıracak. Yani, findçok fazla çıktı üretirse, catbirden çok kez çalışır. Daha -execönceki bölümde bahsedildiği gibi, bu bölünmenin farklı davranışlara yol açabileceği bazı komutlar vardır. Bunun xargsgibi xargskullanmanın, boşlukları sınırlayıcı olarak kullandığından dosya adlarındaki boşluklarla ilgili sorunları olduğunu unutmayın .
En sağlam, taşınabilir ve verimli yöntem ayrıca xargsşunları kullanır :
find [whatever] -print0 | xargs -0 cat
-print0Bayrak söyler findkullanmak \0dosya adları arasında (null karakteri) ayraçları ve -0bayrak söyler xargsbunlar beklemek \0ayraçları. Bu, -exec... +yaklaşımla hemen hemen aynıdır , ancak daha taşınabilir (ama ne yazık ki daha ayrıntılı).
ls.
$()Ayrıca dışındaki komutlarla da çalışır find .
Bana bir kabuk senaryosu için bir iş gibi geliyor:
for file in 'find -name *.xml'
do
grep 'hello' file
done
ya da böyle bir şey
Find komutu, bunun gibi şeyler için kullanabileceğiniz bir -exec argümanına sahiptir, bunu kullanarak doğrudan grep'i yapabilirsiniz.
Örneğin ( buradan, bu sayfadaki diğer iyi örnekler ):
find . -exec grep "www.athabasca" '{}' \; -print
Bash'da aşağıdakiler uygun olacaktır:
find /dir -type f -print0 | xargs -0i cat {} | grep whatever
Bu, /dirdizindeki tüm dosyaları bulur ve güvenli bir şekilde xargssürecek dosya adlarını güvenli bir şekilde aktarır grep.
xargsBinlerce dosyanız varsa atlamak iyi bir fikir değildir /dir; cataşırı değişken listesi uzunluğu nedeniyle kırılacaktır. xargsher şeyi sizin için halledecek.
-print0Argüman findile mesh -0argüman için xargsdüzgün boşluklu dosya isimlerinin işlenmesinde. To -iargümanı xargs, catkomut satırında gereken yere dosya adını eklemenizi sağlar . Köşeli parantezlerin yerine catkomuttan geçirilen dosya adı kullanılır find.
Bu benim için çalışıyor
find _CACHE_* | while read line; do
cat "$line" | grep "something"
done
Ggrep kullanın .
ggrep -H -R -I "mysearchstring" *
geçerli dizinde veya alt dizinde bulunan metin içeren unix'te bir dosyayı aramak için
Bu, yalnızca dosyaların adını ve içeriğini yinelemeli olarak yazdırır.
find . -type f -printf '\n\n%p:\n' -exec cat {} \;
Düzenle (Geliştirilmiş sürüm): Bu, yalnızca metin (ascii) dosyalarının adını ve içeriğini yinelemeli olarak yazdırır.
find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'
Bir deneme daha
find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Dosyalarda metin bulmaya mı çalışıyorsunuz? Bunun için grep'i kullanabilirsiniz ...
grep searchterm *
/ Ghi ve / jkl dizinlerindeki bir sunucudaki tüm abc.def dosyalarının içeriğini listelemek ve görmek için
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \;
Girişleri yorumlayan ve görüntüleyen abc.def dosyalarını listelemek için / ghi ve / jkl dizinlerindeki bu girişlere bakın.
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;
find -name '*.foo' -printbenim için harika çalıştı ... Teşekkürler