Wc'den önce find komutunu kullanmak, toplamı ortadan kaldırır


2

Tüm .py dosyalarını bulmak için tüm alt dizinlerde ve geçerli dizinde arama yapmak için find komutunu kullanıyorum ve ardından satır sayısını bulmak için wc -l komutunu çalıştırıyorum. Ancak, wc ile bul kullandığımda, wc'yi kendim çalıştırdığımın aksine Toplam alan bırakılır. Bunun neden olduğunu bilen var mı?

find . -name \*.py -exec wc -l {} \;
  187 ./check.py
   43 ./file.py
   33 ./mitch.py
       ...
 1014 ./serve.py
   41 ./test_scripts/line_graph.py
   39 ./welcome.py

Ama toplam yok, ama kaçtığımda wc -l *.py bir dizinde toplamı alıyorum:

wc -l *.py
 187 check.py
  43 file.py
  94 log_com.py
 154 log_results.py
  33 mitch.py
1014 serve.py
  39 welcome.py
1564 total

Yanıtlar:


1

wc yalnızca çıktılar Genel Toplam argüman olarak birden fazla dosya ile çağrıldığında değer.

İtibaren GNU kılavuzu :

Birden fazla dosya verilirse, wc kümülatif sayıları içeren bir son satırı, dosya adıyla birlikte basar total.

Senin durumunda, alamazsın Genel Toplam çıktı, çünkü çağırdın wc Bulunan her dosya için bir kez wc çağrı bir öncekini bilmiyor.


Hala toplam sayımı istiyorsan, globstar Bash’de dizinlere ve listelere tekrar girme seçeneği .py Dosyalar:

shopt -s globstar
wc -l **/*.py

Veya, Grawity'nin önerdiği gibi GNU ile find 'ler -exec command {} + seçenek, sahip olmak find bulunan tüm yolları değiştir {}, her birini ayrı ayrı aramak yerine (yerini glob yaklaşımında olduğu gibi değiştirebileceği dosya sayısında bir sınırlama olmasına rağmen).


Ah bu mantıklı. Peki bunun yerine bunu nasıl yapacağım?
taronish4

Gönderim güncellendi. En çok kurşun geçirmez yöntem kullanmaktır. awk - Grawity'nin cevabını görün.
slhck

1

Yok total çünkü sadece bir dosya var.

İle -exec komuta {}; aksiyon, find koşar komuta her dosya için bir kez , her seferinde yalnızca tek bir argüman eklenir. Öyleyse hiçbiri yok wc başlatma toplamı hesaplayabilir.

Kullanmak zorundaydın -exec komuta {} + eğer GNU'nuz varsa find; Aksi takdirde, dosya listesini yayınlamanız gerekir. xargs komuta .

(Bu cevapta her zamanki gibi rahatsız olmayacağım -print0 öneri, çünkü GNU’nun bulunmaması durumunda, -print0 veya hatta GNU xargs. Ancak, eğer xargs versiyonunuz yapar destek -d '\n', bunu kullanın, çünkü xargs'ın varsayılan yolla girişi ayrıştırması çok güvenli değildir.)

Bunun hala birden fazla olabileceğini unutmayın. wc başlatmalar, çünkü çoğu işletim sistemi (belki Hurd hariç), maksimum komut satırı uzunluğu ve / veya maksimum argüman sayısı üzerinde çok sayıda dosyanın aşabileceği tek bir komut için bir sınır vardır. @ slhck'ın kullanım önerisi **/*.py aynı limiti de vurabilirdi (erken Unix'lerin çok düşük limitleri vardı. xargs ilk etapta oluşturuldu).

Başka bir alternatif kullanmaktır awk son hesaplama için:

find ... | awk '$2 != "total" {sum += $1; print}
                END {printf "%7d total\n", sum}'

Meraktan, pratikte sınıra çoktan ulaştınız mı? (Tabii ki bence ne olursa olsun bahsedilmeli.)
slhck

@slhck: Bir kez - pacman'ın indirdiği paket önbelleğindeki her şeyi kaldırmaya çalışırken. (Komutta yanlışlıkla mutlak bir yol kullandım, böylece her yolun uzunluğunu iki katına çıkardım.) Alıştım find -delete alternatif olarak rm -rf * o zamandan beri.
grawity
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.