Secara rekursif menghitung semua file dalam direktori [duplikat]

199

Kemungkinan Duplikat:
Bagaimana saya bisa menghitung jumlah folder dalam drive menggunakan Linux?

Saya memiliki pohon direktori yang sangat dalam di kotak Linux saya. Saya ingin menghitung semua file di jalur itu, termasuk semua subdirektori.

Misalnya, diberikan pohon direktori ini:

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

Jika saya lewat /home, saya ingin mengembalikan empat file. Atau, bonus poin jika mengembalikan empat file dan dua direktori. Pada dasarnya, saya ingin yang setara dengan mengklik kanan folder pada Windows dan memilih properti dan melihat berapa banyak file / folder yang terkandung dalam folder itu.

Bagaimana saya dapat dengan mudah melakukan ini? Saya punya solusi yang melibatkan skrip Python yang saya tulis, tetapi mengapa ini tidak semudah menjalankan ls | wcatau serupa?

omghai2u
sumber
Bukan apa yang Anda cari, tetapi untuk mendapatkan jumlah total yang sangat cepat, jikalocate basis data Anda mutakhir: locate /some/path | wc -l(atau di Mac saya:) locate -c /some/path. Tetapi: ini juga akan menghitung file /this/other/path/with/some/path, dan akan menghitung folder itu sendiri.
Arjan
Omong-omong, ini adalah masalah yang berbeda, tetapi terkait erat (menghitung semua direktori pada drive) dan solusinya: superuser.com/questions/129088/…
Amanda

Jawaban:

341

find . -type f | wc -l

Penjelasan:
find . -type fmenemukan semua file ( -type f ) dalam direktori ( . ) Ini dan di semua sub direktori, nama file kemudian dicetak ke standar satu per baris.

Ini kemudian disalurkan | ke dalam wc(jumlah kata) -lopsi memberitahu wc untuk hanya menghitung baris inputnya.

Bersama-sama mereka menghitung semua file Anda.

Nifle
sumber
1
Ini tidak berurusan dengan kesalahan satu demi satu karena baris baru terakhir dari findoutput
RobertDeRose
hanya untuk menghitung direktori, gunakan '-type d' alih-alih '-type f': D
MevlütÖzdemir
1
Ketika tidak ada file yang ditemukan, hasilnya adalah1
Dylanthepiguy
47

Jawaban di atas sudah menjawab pertanyaan, tetapi saya akan menambahkan bahwa jika Anda menggunakan find tanpa argumen (kecuali untuk folder tempat Anda ingin pencarian terjadi) seperti pada:

find . | wc -l

pencarian berjalan jauh lebih cepat, hampir seketika, atau paling tidak bagi saya. Ini karena klausa tipe harus menjalankan stat () system call pada setiap nama untuk memeriksa tipenya - menghilangkannya menghindari melakukannya.

Ini memiliki perbedaan mengembalikan jumlah file plus folder daripada hanya file, tetapi setidaknya bagi saya itu sudah cukup karena saya kebanyakan menggunakan ini untuk menemukan folder mana yang memiliki jumlah file besar yang membutuhkan waktu lama untuk menyalin dan mengompresnya. Menghitung folder masih memungkinkan saya menemukan folder dengan sebagian besar file, saya membutuhkan lebih banyak kecepatan daripada presisi.

Francisco Vieira
sumber
1
Ketika tidak ada file yang ditemukan, hasilnya adalah1
Dylanthepiguy
25

Untuk file:

find -type f | wc -l

Untuk direktori:

find -mindepth 1 -type d | wc -l

Keduanya bekerja di direktori kerja saat ini.

cYrus
sumber
1
Ketika tidak ada file yang ditemukan, hasilnya adalah1
Dylanthepiguy
8

Dengan bash 4+

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"

Tidak perlu memanggil menemukan dua kali jika Anda ingin mencari file dan direktori

pengguna31894
sumber
8

Perbarui sedikit jawaban yang diterima, jika Anda ingin hitungan dir dan semacamnya

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Homolka yang kaya
sumber
1
Pada Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Di sini, ketik %Tkosong untuk file biasa, tanda bintang untuk file yang dapat dieksekusi, atau garis miring untuk folder; karena %HTitu diperlukan, atau beberapa teks tambahan untuk menghindari ruang agar tidak dihitung, seperti > %T. )
Arjan
Memberi saya "temukan: opsi ilegal - e" di 10.13.6 mac saya
K.-Michael Aye