Wc ile satırları sayarken, dizin olduğunda hata yazdırmayın


12

Tüm /etcdosyalarda toplam satır sayısını saymak istiyorum ama alt dizinlerde dosyaları değil, bu yüzden yazdım: wc -l /etc/* | tail -1ve çıktı gibi:

xxxx is a directory 
yyyy is a directory
total 1752

Sorum şu: Bu yorumları nasıl kaldırabilirim (silebilirim) ve bu tür bir sayım yapmanın daha iyi bir yolu var mı?


1
Ben find kullanarak% 100 wright olmadığını düşünüyorum, çünkü / etc sadece f düzenli dosyaları değil, aynı zamanda l bağlantıları. bu yüzden bu sürüm çok daha iyi: $ sudo wc -l / etc / * 2> / dev / null | kuyruk -1
Hamza

Yanıtlar:


14

Hata mesajlarını / dev / null dizinine gönderebilirsiniz

$ wc -l /etc/* 2>/dev/null | tail -1

Bu komutla, yalnızca dünya tarafından okunabilen dosyalardaki satır sayısını görebilirsiniz. Komutu yükseltmeniz gereken tüm dosyaların satır sayısını görmek için sudo.

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

Dosyaları ayırın ve üzerlerinde wc çalıştırın

Bu wc -l /etc/*, dizindeki *tüm öğelere genişleyecek /etc/. Böylece amaç dosyaları izole etmek ve wcüzerinde işlem yapmaktır . Bunu yapmanın birkaç yolu vardır.

testli döngü için

testDaha sık olarak kısaltılır komut veya [kullanılabilen bir madde şöyle normal bir dosya olup olmadığını bulmak için:

[ -f "$FILE" ]

Dolayısıyla, yapabileceğimiz tüm öğeler üzerinde yineleme yapmak ve sadece yukarıdaki komut doğruysa bunları /etc/çalıştırmaktır wc. Şöyle ki:

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

bulmak

Biz de kullanabilirsiniz findile -maxdepth, -typeve -execbayrakları

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepthdizin yapısında ne kadar derine ineceğini bulur; 1 değeri yalnızca istediğimiz dizindeki dosyalar anlamına gelir.
  • -type f normal dosyaları aramasını söyler VEYA ( -obayrakla temsil edilir type l) sybolic bağlantılar (ile temsil edilir ) Tüm bu iyilik, kabuğun onları başka bir şeyden ziyade komutanın bir parçası olarak yorumlaması için ()kaçan köşeli parantez içine alınır .\find
  • -exec COMMAND {} +Buradaki yapı, verdiğimiz +tüm komutları çalıştırır , bulunan tüm dosyaları almayı ve bunları COMMAND'a komut satırı argümanları olarak doldurmayı belirtir.

Toplam üretmek için biz boru çıkış tailgibi olabilir

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

Kenar notu

wc -l /etc/* 2>/dev/null | tail -1LD James'in cevabında olduğu gibi kullanımı daha kolaydır , ancak findzor dosya adlarını işlemekten kaçınmak için dosyalarla uğraşma alışkanlığının bir parçası olmalıdır. Bununla ilgili daha fazla bilgi için Dosya adlarıyla doğru şekilde nasıl başa çıkılacağı makalesini okuyun


5

find bunu kolayca yapar:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

Çıktı:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

AMA eğer sadece numarayı istediğiniz çıktı ve başka bir şey olarak:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

EDIT : newlineshata kos dedi hakim. Sadece kullanarak -execdüzeltir. Ayrıca, /etcbu tür dosyalar içermez.

Çıktı:

8169

Kos'un işaret ettiği gibi , yukarıdaki komut şu şekilde azaltılabilir:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

EDIT : newlineshata kos dedi hakim. Sadece kullanarak -execdüzeltir. Ayrıca, /etcbu tür dosyalar içermez.

Çıktı:

8169

4
Amacı nedir -iname '*'? findvarsayılan olarak her şeyle eşleşmiyor mu?
steeldriver

@steeldriver - O olmadan benim için çalışmadı '*'.
Raphael

2

Kabukların kraliçesi z-shell ( zsh) kullanarak bash yerine.

sudo wc -l /etc/*(.) | tail -1
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.