it-swarm-tr.com

Dizinler aracılığıyla tüm dosyaları yinelemeli olarak nasıl sayabilirim

Tüm inode kullanımının sistemde nerede olduğunu bulmak için alt dizinlerde kaç dosya olduğunu görmek istiyorum. Alan kullanımı için bunu yapacağım gibi

du -sh /*

bu bana kök dışı dizinlerde kullanılan alanı verecektir, ama bu durumda dosya sayısını değil, boyutunu istiyorum.

52
xenoterracide
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Güvenlik/uyumluluk düzeltmeleri için Gilles ve xenoterracide'a teşekkürler.

İlk bölüm: find -maxdepth 1 -type d geçerli çalışma dizinindeki tüm dizinlerin bir listesini döndürür. Bu boru ...

İkinci kısım: while read -r dir; do bir while döngüsü başlatır - while gelen boru açık olduğu sürece (tüm dizin listesi gönderilene kadar), read komutu bir sonraki satırı "dir" değişkenine yerleştirir. Sonra devam ediyor ...

Üçüncü bölüm: printf "%s:\t" "$dir";, dizeyi "$ dir" (dizin adlarından birini tutan) ve ardından bir sekmede yazdırır.

Dördüncü bölüm: find "$dir -f file" "$ dir" içinde tutulan dizin adı içindeki tüm dosyaların bir listesini yapar. Bu liste şuraya gönderilir ..

Beşinci bölüm: wc -l;, standart girişine gönderilen satır sayısını sayar.

Son bölüm: done, while döngüsünü sonlandırır.

Böylece, geçerli dizindeki tüm dizinlerin bir listesini alırız. Bu dizinlerin her biri için, içindeki tüm dosyaların bir listesini oluştururuz, böylece wc -l. Sonuç şöyle görünecektir:

./dir1: 234
./dir2: 11
./dir3: 2199
...
67
Shawn J. Goff

Deneyin find . -type f | wc -l, geçerli dizindeki tüm dosyaların yanı sıra alt dizinlerdeki tüm dosyaları sayar. Tüm dizinlerin dosya olarak sayılmayacağını, sadece sıradan dosyaların olduğunu unutmayın.

17
herohuyongtao

İşte bazı kullanışlı listeleme komutlarının bir derlemesi (önceki kullanıcı koduna göre yeniden karma):

Dosya sayısı olan klasörleri listele:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

Sıfır olmayan dosya sayısına sahip klasörleri listele:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Alt klasör sayısı olan klasörleri listele:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

Sıfır olmayan alt klasör sayısına sahip klasörleri listele:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Boş klasörleri listele:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

İçerik sayısı olmayan boş olmayan klasörleri listeleyin:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
13
DolphinDream

Deneyin:

find /path/to/start/at -type f -print | wc -l

başlangıç ​​noktası olarak veya gerçekten bir dizinin alt dizinleri aracılığıyla gerçekten geri dönmek istiyorsanız (ve bu üst düzey dizindeki dosyaları atlayın)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
12
Cry Havok

Aşağıdaki çözüm, geçerli dizinden başlayarak kullanılan gerçek düğüm sayısını sayar:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

Aynı alt kümedeki dosya sayısını almak için şunu kullanın:

find . | wc -l

Geçerli dizindeki dosyaları dikkate almadan yalnızca alt dizinleri araştıran çözümler için diğer yanıtlara başvurabilirsiniz.

4
mouviciel

OS X 10.6, find için bir yol belirtmediğinden, kabul edilen yanıttaki komutu boğar. Bunun yerine kullanın:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
2
abeboparebop

Partiye geç kaldığımı biliyorum, ama bu saf bash (veya çift yıldız glob'u kabul eden diğer Shell) çözümünün bazı durumlarda çok daha hızlı olabileceğine inanıyorum:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

çıktı:

d1/:    302
d2/:    24
d3/:    640
...
2
jimmij

Bunu deneyin:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

Dosya adları yeni satır içermiyorsa iyi çalışmalıdır.

du --inodes

Kimsenin (kendim dahil) neden farkında olmadığından emin değilim:

du --inodes
--inodes
      list inode usage information instead of block usage

Eminim bu OP'nin problemini çözer. Büyük sürücülerimdeki tüm önemsizlerin nerede olduğunu bulmak için çok kullanmaya başladım (ve daha eski bir diske aktardım).

Daha fazla bilgi

Tekrarlamak istemiyorsanız (diğer durumlarda faydalı olabilir),

-S, --separate-dirs
1
Sridhar Sarnobat

ncdu yüklüyse (biraz temizleme yapmak istediğinizde olmazsa olmaz), c yazıp "Alt öğe sayılarının görüntüsünü aç/kapat" seçeneğine yazmanız yeterlidir. Ve C ile "Öğelere göre sırala".

1
Demi-Lune