Linux find komutunu kullanarak dosya adı yerine içeriği nasıl yazdırabilirim?


10

Bunun gibi bir ad taşıyan binlerce unl dosyam var cbs_cdr_vou_20180624_603_126_239457.unl. Aşağıdaki komutu kullanarak bu dosyalardan tüm satırları yazdırmak istedim. ama bana sadece dosya isimleri veriyor. Dosya adlarına ihtiyacım yok, sadece bu dosyalardan içeriklere ihtiyacım var.

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

Akım Çıkışı:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

Beklenen çıktı:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

Cat komutu için komut yerine -bash: /bin/logger: Argument list too longkullanmak istediğim için hata alıyorum .findcat


Yine de kullanmanız gerekiyor cat.
Ignacio Vazquez-Abrams

Evet! Bana bunu nasıl yapabileceğimi söyler misiniz? @ IgnacioVazquez-Abrams
Rezuan

Yanıtlar:


28

Yardımcı findprogram yol adları ile ilgilenir. findBulunan yol adları için komutta belirli bir eylemden bahsedilmezse , varsayılan eylem bu çıktıları vermektir.

Böyle çalışan olarak bulundu pathnames, bir eylemi gerçekleştirebilir catekleyerek, -execkarşı findkomuta:

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Bu, geçerli dizindeki veya altındaki, adları verilen kalıpla eşleşen tüm normal dosyaları bulur. Bunun için mümkün olduğunca büyük gruplar cat, dosyaların içeriğini birleştirmek için çağrılabilir.

Çıktı giderdi /home/fifa/cbs/test.txt.

İlişkili:


1
Beklendiği gibi çalışmak ve yürütme süresi çok hızlı, bu gerçekten harika. Çok teşekkürler.
Rezuan

12

Çıktısı find, ilgili dosya adlarıyla sonuçlanır. Komutu her dosyada gerçekleştirecek çıktıyı
birbirine bağlayabilirsiniz ( |) .xargs catcat

Örneğin:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

Başka bir seçenek kullanmak olacak -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt

4
Her iki komutunuz da iyi çalışıyor. Ama Kusalananda'nın emrinden biraz daha yavaş . Sanırım yürütme süresi değişiyor -exec cat {} \;ve -exec -cat {} +. Bu arada, çok teşekkürler Yaron.
Rezuan

xargs, bulunan yol adlarındaki boşluklara karşı savunmasızdır; -exec kedi {} değil
jez

2
find -print0 | xargs -0boşluklara / kotalara / vb. karşı savunmasız değildir.
kabarık

1
@Rezuan: Cat'i -exec cat {} \;xargs gibi birleştirmek yerine her dosya için ayrı çalıştırır. Bunu açıkça istemediğiniz sürece (örn. Tek seferde yalnızca bir dosya için çalışan bir komut) veya / içermeyen -exec ... +ve içermeyen bir sisteme taşınabilirliğe ihtiyacınız yoksa kullanmayın . Yine de ölçülebilir derecede yavaş olduğu için biraz şaşırdım . Çok az toplam dosyanız var, bu nedenle başlangıç ​​ek yükü maliyetin büyük bir kısmı mı? Yoksa sadece disk önbelleğiniz soğukken sürüme mi baktınız? -print0xargs -0find|xargs-exec cat {} +xargs
Peter Cordes

1
@PeterCordes açıklama için teşekkürler. Disk önbellek içindi, daha sonra fark ettim.
Rezuan
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.