“Bul” komutunun çıktısında “cat” komutu nasıl kullanılır?


13

Verilen dosyanın verilerini yazdırabilmek findiçin catkomutun çıktısını komuta yönlendirmek istiyorum .

Örneğin, eğer buluntunun çıktısı /aFile/readmeo zaman kedi olarak yorumlanmalıdır cat ./aFile/readme. Bunu anında nasıl yapabilirim?

Boru kullanmak zorunda mıyım?

Bunun sürümlerini denedim:

cat | find ./inhere -size 1033c 2> /dev/null

Ama sanırım bu tamamen yanlış mı? Tabii ki çıktı sadece birden fazla dosya değil, sadece bir dosya olduğundan eminim.

Peki bunu nasıl yapabilirim? Google'da arama yaptım ve muhtemelen doğru aramadığım için bir çözüm bulamadım: P

Yanıtlar:


21

Eylemi findkullanarak bunu tek başına yapabilirsiniz -exec:

find /location -size 1033c -exec cat {} +

{}bulunan dosyalara genişletilecek ve +çağırma başına mümkün olduğunca çok sayıda argümanı okumamızı sağlayacak cat, çünkü kedi birden fazla argüman alabilir.

Eğer senin findyok +uzantısı veya tek tek dosyaları okumak istiyorum:

find /location -size 1033c -exec cat {} \;

Herhangi bir seçeneğini kullanmak istiyorsanız, şunları yapın cat:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Burada -nsatır numaralarını almak için seçeneği kullanıyorum .


Yani, eğer doğruysam: {} içinde find komutunun çıktısının saklandığı bir değişken gibi ve "+" işaretinden sonra cat parametrelerini yazmanız gerekiyor mu? Hayır ? Edit: Tamam yazınızı düzenlediniz ve şimdi sadece soruma cevap verdiniz: P Thanx man! Çözüldü!
Eksapsy

Düzenlemelerimi kontrol et ..
heemayl

1
catO'nun -nseçeneğini bilmediğim gerçeği beni şaşırtıyor. Rastgele sorular okumayı seviyorum.
mazunki

1

Komut Değiştirme

Başka bir seçenek de Komut Değiştirme kullanmaktır . Bir komutun kaydırılması komutu $()çalıştırır ve komutu çıktısıyla değiştirir.

cat $(find ./inhere -size 1033c 2> /dev/null)

Olacak

cat ./inhere/file1 .inhere/file3

Bu, geri kenelerle eski sarma komutları stilini kullanmaya daha fazla veya daha az eşdeğerdir:

cat `find ./inhere -size 1033c 2> /dev/null`

Yukarıda bağlantılı dokümanlardan daha fazla ayrıntı

Bash, bir alt kabuk ortamında komut yürüterek ve komut ikamesini, komutun standart çıktısıyla değiştirerek ve sondaki yeni satırlar silinerek genişletmeyi gerçekleştirir. Katıştırılmış yeni satırlar silinmez, ancak kelime ayırma sırasında kaldırılabilir. Komut ikamesi $(cat file), eşdeğer ancak daha hızlı ile değiştirilebilir $(< file).

İkame eski tarz backquote formu kullanıldığında, eğik çizgi takip durumlar hariç, değişmez anlamı taşır $, `ya da \. Ters eğik çizgiden önce gelmeyen ilk backquote, komut değişikliğini sonlandırır. $(command)Formu kullanırken, parantezler arasındaki tüm karakterler komutu oluşturur; hiçbirine özel muamele edilmez.

Komut ikameleri iç içe olabilir. Geri alıntılanan formu kullanırken yuvalamak için, iç ters tırnaklardan ters eğik çizgilerle kaçın.

İkame çift tırnak içinde görünüyorsa, sonuçlarda sözcük bölme ve dosya adı genişletme yapılmaz.

Bazı iyi kullanım örnekleri için bu diğer cevaba bakınız .


Eğer Not olduğunu findbulur çok sayıda dosya, bu "çok uzun argüman listesi" bir üretecek hata Whet çağırmak için çalışıyor cat. Ayrıca boşluk karakterleri içeren dosya adlarını ve muhtemelen dosya adı globbing karakterlerini içeren dosya adlarını işlemede sorun yaşayabilir.
Kusalananda

0

Bu, metin (ascii) dosyalarının adını ve içeriğini yalnızca özyinelemeli 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 {} \;

-2

Boru ve xargs kullanın

find /* -name pg_hba.conf | xargs cat

İzinlerin olmaması nedeniyle başarısız olursa, sudo'yu kullanarak aradığınız dizinde find komutunu çalıştırma izniniz olduğundan emin olabilirsiniz.

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
Ve birisi adlı bir dosya oluşturduysa /tmp/ /dev/urandom /pg_hba.conf, bu kökün tüm içeriğini boşaltmasına izin verecektir /dev/urandom. Bağlama bağlı olarak muhtemelen daha kötüsü yapılabilir. xargsneredeyse hiç kullanılmadan kullanılmamalıdır -0. Ayrıca sudo xargsdaha iyi olurdu xargs sudo. Ve /*daha iyi olurdu /.
Stéphane Chazelas

1
OP stdout dosya içeriğini yazdırmak için cat kullanmak istiyor. Yani amaca kedi tarafından hizmet edilir. Soru, sudo veya find nasıl kullanılacağını değil, dosyanın içeriğini yazdırmak için find komutunun cat komutunun nasıl kullanılacağıdır, Yukarıdaki komut soruyu çözer. Evet xargs -0 işaret ettiğin tek yapıcı şeydi. Ama kullanımı göstermedi. Kaba olmamaya çalışın.
Uygulama Çalışması

Bu kaba görünüyorsa özür dilerim. Niyet bu değildi. Sınırlamaları belirtmek istedim. Cevabınız kötü uygulamaları gösteriyor ( find|xargsolmadan -0gerçekten yasaklanmalıdır), dolayısıyla aşağı oy. findOlmadan çıktı -print0güvenilir bir şekilde sonradan işlenemez. -print0standart değildir. Bunu söyledikten sonra, standart sudo find / -name pg_hba.conf -exec cat {} +aynı zamanda içeriğinin dökülmesini sağlayabilir /dev/urandom(örneğin, birinden bir sembolik bağlantı oluşturduysa /tmp/pg_hba.confve bunun etrafında en azından bir yarış durumu olmayan kolay taşınabilir bir yol yoksa).
Stéphane Chazelas

1
sudo"Her ihtimale karşı" kullanmayalım , değil mi?
lindhe

Peki, koşmaktan daha iyisudo rm -rf /
devinbost
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.