Bir dizindeki tüm dosyaları tekrar tekrar sayın [duplicate]


198

Olası Çoğalt:
Bir sürücüdeki Linux sayısını Linux kullanarak nasıl sayabilirim?

Linux kutumda gerçekten derin bir dizin ağacım var. Tüm alt dizinler de dahil olmak üzere bu yoldaki tüm dosyaları saymak istiyorum.

Örneğin, bu dizin ağacı verilen:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Eğer geçersem /home, dört dosya geri göndermesini istiyorum. Veya, eğer dört dosya ve iki dizin döndürürse, bonus puan. Temel olarak, Windows'ta bir klasöre sağ tıklayıp özellikleri seçmek ve bu klasörde kaç tane dosya / klasör bulunduğunu görmek istiyorum.

Bunu en kolay nasıl yapabilirim? Yazdığım bir Python senaryosunu içeren bir çözümüm var, fakat neden bu kadar kolay ls | wcya da benzer değil?


Tam olarak aradığınız ama, çok hızlı bir genel toplamı elde etmek için ne olursa senin locateveritabanı güncel olduğundan: locate /some/path | wc -l(ya da benim Mac'te: locate -c /some/path). Ancak: Bu aynı zamanda dosyaları /this/other/path/with/some/pathiçerecek ve klasörlerin kendilerini sayacak.
Arjan

Bu arada, bu farklı, ama birbiriyle yakından ilgili bir sorun (sürücüdeki tüm dizinleri sayarak) ve çözüm: superuser.com/questions/129088/…
Amanda

Yanıtlar:


340

find . -type f | wc -l

Açıklama: Bu ( . ) Dizindeki
find . -type ftüm dosyaları ( -type f ) bulur ve tüm alt dizinlerde, dosya adları daha sonra her satırda bir standart olarak yazdırılır.

Bu daha sonra borulu | içine wc(sözcük sayımı) -lseçenek, wc'ye yalnızca girişinin satırlarını saymasını söyler.

Birlikte tüm dosyalarınızı sayarlar.


1
Bu, findçıktının son
satırının

D: SADECE dizinleri saymak için, onun yerine 'tipi f' arasında 'tipi d' kullanmak
MevlütÖzdemir

1
Dosya bulunamadı, sonuç şöyledir1
Dylanthepiguy

47

Yukarıdaki cevaplar zaten soruyu cevaplar, ancak şunu ekleyeceğim: argüman olmadan bul'u kullanırsanız (aramanın gerçekleşmesini istediğiniz klasör hariç):

find . | wc -l

arama çok daha hızlı, neredeyse anlık veya en azından benim için yaptı. Bunun nedeni, tür yan tümcesinin türünü denetlemek için her adın üzerinde bir stat () sistem çağrısı yürütmesi gerektiğidir - bunu yapmaktan kaçınır.

Bu, yalnızca dosya yerine dosya sayısını artı klasörleri döndürme farkına sahiptir, ancak en azından benim için bu, çoğunlukla hangi klasörleri kopyalamak ve sıkıştırmak için sonsuza dek sürecek çok büyük miktarda dosya bulunduğunu bulmak için kullanıyorum. Klasörleri saymak, hala çoğu dosyaya sahip klasörleri bulmama izin veriyor, hassasiyetten daha fazla hıza ihtiyacım var.


1
Dosya bulunamadı, sonuç şöyledir1
Dylanthepiguy

25

Dosyalar için:

find -type f | wc -l

Dizinler için:

find -mindepth 1 -type d | wc -l

Her ikisi de geçerli çalışma dizininde çalışır.


1
Dosya bulunamadı, sonuç şöyledir1
Dylanthepiguy

8

Bash 4+ ile

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Dosyaları ve dizinleri aramak istiyorsanız iki kez bulmaya gerek yok


8

Çok sayıda güncelleme yapmak istiyorsanız, kabul edilen cevaplara hafif bir güncelleme yapın.

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn

1
On Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Burada, tip %Tdolayısıyla düzenli bir dosyaya, bir yürütülebilir dosya veya bir klasör için bir eğik çizgi için yıldız işareti için boş %HTgerekli olan veya bazı ekstra metin gibi sayılmadığından gelen boşluk önlemek için > %T. )
Arjan

10.13.6 mac'umda "find: illegal seçenek - e" ifadesini veriyor
K.-Michael Aye
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.