Tüm dosyaları tekrar tekrar dizinler aracılığıyla nasıl sayabilirim?


47

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

du -sh /*

Bu bana dizinlerde kullanılan kökten alan vereceğim, ancak bu durumda dosya boyutunu değil boyutu istiyorum.



Bence "alt dizinlerde kaç tane dosya var?" Alt dizinlerinde kafa karıştırıcı bir yapı var. Ne istediğinizi daha net bir şekilde belirtirseniz, tasarıya uygun bir cevap alabilirsiniz.
Steven D

@Steven yeniden yazmaktan çekinmeyin ... Ben de örneğimin sayımın du -sh /*nasıl çalışmasını istediğimi açıkça belli ettiğini düşündüm. Aynı şey, sadece dosyaları bayt saymak.
xenoterracide

İnode kullanımından bahsettiğiniz gibi, dosya sayısını mı yoksa kullanılan inode sayısını mu saymak istediğinizi anlamıyorum. Dosya sisteminde sabit bağlantılar bulunduğunda ikisi farklıdır. Hepsi olmasa da çoğu cevaplar dosya sayısını verir. Bunları bir Apple Time Machine yedek diskinde kullanmayın.
mouviciel

@mouviciel bu bir yedekleme diskinde kullanılmıyor ve evet, sanırım farklı olabilirler, ama ben orada bulunduğum bir ortamda çok az sayıda hardlink var, teknik olarak sadece bunun için bir fikir edinmem gerekiyor. Birinin nerede yandığını anlayalım inode kotası.
xenoterracide 19:10

Yanıtlar:


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

Güvenlik ve uyumluluk düzeltmeleri için Gilles ve xenoterracide sayesinde.

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

İkinci bölüm: while read -r dir; dobir süre döngüsünü başlatır - sürenin içine giren boru açık olduğu sürece (tüm dizin listesi gönderilinceye 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 isimlerinden birini tutan) ve ardından sekme yazacaktır.

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

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

Son kısım: donewhile döngüsünü sonlandırır.

Böylece mevcut dizindeki tüm dizinlerin bir listesini alırız. Bu dizinlerin her biri için, içindeki tüm dosyaların bir listesini oluşturur, böylece hepsini kullanarak sayabiliriz wc -l. Sonuç gibi görünecek:

./dir1: 234
./dir2: 11
./dir3: 2199
...

Her zaman read -rdüz readters eğik çizgi gibi özel olarak kullanın . Sonra echo -en "$dir:\t"tekrar ters eğik çizgiler mangle olacak; printf '%s:\t' "$dir"bunun yerine basit bir düzeltme kullanmaktır . Daha sonra, $dirolmalıdır "$dir"( değişken değişkenleri etrafında daima çift tırnak kullanın ).
Gilles 'SO- kötülük yapmayı bırak'

@Giles önerileri uyarınca değiştirildifind -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
xenoterracide

2
Bunun sort -n -r -k2sonuna, birçok dizin için ekliyorum , böylece en çok kullanımın nerede olduğunu biliyorum
xenoterracide

Dördüncü bölüm: "$ dir" ifadesi, "$ dir" dizininde yer alan tüm dosyaların listesini yapar. -type fDosyaları listelemek için eklemeyi unuttun :find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch

@ krzysiek-boduch Teşekkürler! Cevabı güncelledim.
Shawn J. Goff

15

Dene find . -type f | wc -l, geçerli dizindeki tüm dosyaların ve alt dizinlerdeki tüm dosyaların sayısını sayar. Tüm dizinlerin dosya olarak sayılmayacağını, sadece sıradan dosyaların yapılacağını unutmayın.


13

İşte bazı yararlı listeleme komutlarının bir derlemesi (önceki kullanıcı koduna göre yeniden birleştirilmiştir):

Dosya sayımlı 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ımlı 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ımlı 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ı olan 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ımına sahip boş olmayan klasörleri listele:

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

Ve btw .. eğer bu liste komutlarının herhangi birinin çıktısını item sayısına göre sıralamak istiyorsanız .. komutu bir sıralama dizisine alın: "a-list-command" | sort -n
DolphinDream

12

Deneyin:

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

başlangıç ​​noktası olarak veya gerçekten sadece bir dizinin alt dizinlerini tekrarlamak istiyorsanız (ve o ü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

Bir şey için +1 | wc -l ... kelime sayısı çok hoş bir küçük araçtır
Johan

evet ama bu sadece 1 dizin yapar .... Bir dizindeki tüm dizinlerin sayımını almak isterdim ve her seferinde ayrı ayrı çalıştırmak istemiyorum ... tabii ki bir döngü kullanabilirim ... ama tembel oluyorum.
xenoterracide

findvarsayılan olarak tüm alt dizinlerde özyinelemeli çalışır. Eğer birden fazla yerde çalışmak istiyorsanız, size arasına hepsini belirtebilirsiniz findve -type.
Didier Trosset,

bu ikinci kesinlikle işe yaramadı .... Ben denedim / ev. Anladım 698035 . Yaklaşık 6 sayı görmeliyim.
xenoterracide

Bu benim için çalışıyor - altında sadece 6 dosyanız olduğuna emin misiniz /home? Yapmadığından% 100 emin olacağım.
17:10

4

Aşağıdaki çözüm, geçerli dizinden başlayan asıl kullanılan sayı 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

Yalnızca alt dizinleri araştıran çözümler için, geçerli dizindeki dosyaları dikkate almadan diğer yanıtlara bakabilirsiniz.


1
Bağlantıları dikkate alarak iyi bir fikir. GNU find varsayarsak, bu kadar çok adımlar gerekmez: find -printf '%i\n' | sort -u | wc -l. Taşınabilir olmak istersen, ihtiyacın olacak find . -exec ls -id {} + | cut ….
Gilles 'SO- kötülük yapmayı bırak'

2

OS X 10.6 kabul edilen cevabın komutunda boğuluyor, çünkü bunun için bir yol belirtmiyor find. 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

Partiye geç kaldığımı biliyorum, ancak bu saf bash(veya çift yıldız küresini kabul eden başka bir kabuğun) çözümünün bazı durumlarda 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
...

1

Bunu bir deneyin:

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

Dosya isimleri yeni satırlar içermedikçe iyi çalışmalıdır.


özyinelemeli yol ... Ben sadece altındaki her şeyi topladığı üst seviyeyi görmek istiyorum. toplandı ... bu her dizinin yazdırılmasıyla sonuçlanır.
xenoterracide

@ xenoterracide: İlkinden -maxdepth 1hemen sonra eklemeyi deneyin find. Sayınıza alt dizinlerin sayısını dahil etmek istiyorsanız -type f, sonuna kaldırın (bu, gerçekten ! -type dde olması gereken , böylece tüm dizin dışı dosyaların eklenmesi için).
Dennis Williamson,

1

Yüklü iseniz ncdu(biraz temizlik yapmak istediğinizde olması gereken), c"Alt öğe sayısının gösterimini değiştir" yazmanız yeterlidir . Ve C"Öğelere göre sırala" ya.


1
lol, bu en çok kabul edilen cevap olmalı :)
x-yuri

0

du - inode

Neden hiç kimsenin (kendim dahil değil) farkında olmadığından emin değilim:

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

Bunun OP'nin sorununu çözdüğünden oldukça eminim. Devasa sürücülerimdeki tüm hurdaların nerede olduğunu bulmak için çok kullanmaya başladım (ve daha eski bir diske aktardım).

Daha fazla bilgi

Tekrar etmek istemezseniz (ki bu diğer durumlarda yararlı olabilir),

-S, --separate-dirs
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.