Anda mengacaukan bilah yang rusak ¦(ASCII 166) dengan bilah vertikal |(ASCII 124) yang digunakan untuk pipa UNIX .
Skippy le Grand Gourou
7
@ SkippyleGrandGourou Bukankah itu disebut pipa?
DaveStephens
27
@ DaveStephens Ya, itu juga disebut itu. Ini juga disebut stroke Sheffer, bar vertikal, vbar, tongkat, garis vertikal, garis miring vertikal, batang, obelisk, glidus.
emlai
64
@zen Dengan begitu saya sebut saja Bob.
Christopher
15
Dalam RFC20 itu disebut "garis vertikal". "Pipa" adalah nama operator shell, bukan nama simbol. Sama seperti *karakter ASCII "tanda bintang", tetapi "waktu" dalam beberapa konteks lain.
langsing
Jawaban:
1327
Ini seharusnya bekerja:
find DIR_NAME -type f | wc -l
Penjelasan:
-type f untuk hanya menyertakan file.
|( dan tidak¦ ) mengarahkan findoutput standar wcperintah ke input standar perintah.
wc(kependekan dari jumlah kata) menghitung baris baru, kata dan byte pada inputnya ( dokumen ).
-l hanya menghitung baris baru.
Catatan:
Ganti DIR_NAMEdengan .untuk mengeksekusi perintah di folder saat ini.
Anda juga dapat menghapus -type funtuk memasukkan direktori (dan symlink) dalam hitungan.
Mungkin perintah ini akan menghitung berlebihan jika nama file dapat berisi karakter baris baru.
Penjelasan mengapa contoh Anda tidak berfungsi:
Pada perintah yang Anda tunjukkan, Anda tidak menggunakan "Pipa" ( |) untuk menghubungkan dua perintah, tetapi bilah yang rusak ( ¦) yang shell tidak kenali sebagai perintah atau yang serupa. Itu sebabnya Anda mendapatkan pesan kesalahan itu.
The fdalam -type fsingkatan file dan wc -luntuk jalur jumlah kata.
Serge Stroobandt
3
Hapus -type funtuk memasukkan direktori dalam hitungan
phatblat
3
Tidak perlu untuk -printbendera
Zoltán
3
Jika ada kemungkinan nama file berisi karakter baris baru Anda mungkin ingin menggunakan -print0bendera.
gaboroncancio
2
@ gaboroncancio Itu tidak akan membantu, kecuali beberapa implementasi wcmemiliki opsi untuk membaca daftar nol yang dihentikan. Lihat jawaban saya untuk alternatif.
Solusi ini tidak mempertimbangkan nama file yang mengandung baris baru.
Kusalananda
2
Untuk direktori saat ini, Anda bahkan tidak perlu.
baptx
1
Sebenarnya, pada beberapa platform, Anda jangan perlu mengejafind .
tripleee
1
@ Kusalanandra Komentar Anda berlaku untuk hampir setiap jawaban di sini.
tripleee
69
Jika Anda ingin rincian berapa banyak file dalam setiap dir di bawah dir Anda saat ini:
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
Itu bisa dilakukan semua dalam satu baris, tentu saja. Tanda kurung mengklarifikasi keluaran siapa wc -lyang seharusnya ditonton ( find $i -type fdalam hal ini).
Menggunakan finduntuk loop luar hanyalah komplikasi yang tidak perlu. for i in */; do`
tripleee
function countit {for i in $ (find. -maxdepth 1 -type d); do file_count = $ (temukan $ i -type f | wc -l); echo "$ file_count: $ i"; selesai}; countit | sort -n -r
Schneems
Akhirnya inilah yang saya butuhkan. Folder saya memiliki ribuan file sehingga mencetaknya dengan pohon atau apa pun bukan pilihan
lesolorzanov
Ini termasuk ../ dan sepertinya tidak maju - artinya tidak regresif.
Daniel Lefebvre
50
Kamu bisa menggunakan
$ tree
setelah menginstal paket tree dengan
$ sudo apt-get install tree
(pada mesin Linux Debian / Mint / Ubuntu).
Perintah tidak hanya menampilkan jumlah file, tetapi juga jumlah direktori, secara terpisah. Opsi -L dapat digunakan untuk menentukan tingkat tampilan maksimum (yang, secara default, adalah kedalaman maksimum pohon direktori).
File tersembunyi juga dapat disertakan dengan menyediakan -aopsi.
Ini sebenarnya adalah cara paling sederhana untuk melihat sejumlah direktori dan file.
Lorem Ipsum Dolor
11
Dari halaman manual: Secara default tree tidak mencetak file tersembunyi . Anda harus menyediakan -aopsi untuk memasukkannya.
eee
3
Untuk menginstal ini di macOS, gunakan brewdan jalankan brew install tree, lebih disukai setelah berjalan brew update.
Ashish Ahuja
4
Ini juga mencetak semua nama file, jadi akan lambat jika Anda memiliki banyak file.
Franck Dernoncourt
2
Wow, alat yang sangat bagus, dapat mencetak folder berwarna, hanya daftar folder, keluaran sebagai JSON. Ini dapat mendaftar folder 34k dan file 51k dalam beberapa detik. Olé!
brasofilo
46
Di komputer saya, rsyncsedikit lebih cepat daripada find | wc -ldi jawaban yang diterima:
$ rsync --stats --dry-run -ax /path/to/dir /tmp
Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes
Baris kedua memiliki jumlah file, 150.481 dalam contoh di atas. Sebagai bonus, Anda mendapatkan ukuran total juga (dalam byte).
Catatan:
baris pertama adalah hitungan file, direktori, symlink, dll semuanya, itu sebabnya lebih besar dari baris kedua.
opsi --dry-run(atau -nsingkatnya) penting untuk tidak benar-benar mentransfer file!
Saya menggunakan -xopsi untuk "jangan melewati batas filesystem", yang berarti jika Anda menjalankannya /dan Anda memiliki hard disk eksternal yang terpasang, itu hanya akan menghitung file pada partisi root.
Saya suka ide Anda menggunakan rsync di sini. Saya tidak akan pernah memikirkannya!
Qeole
Terima kasih @ Quole, idenya bukan milikku. Saya membacanya beberapa tahun yang lalu di suatu tempat bahwa rsync adalah yang tercepat untuk menghapus folder dengan banyak file dan subfolder, jadi saya pikir mungkin lebih cepat untuk menghitung file juga.
psmith
1
Sudah mencoba ini. Setelah menjalankan keduanya dua kali sebelumnya untuk mengisi cache fs, find ~ -type f | wc -lbutuh 1,7 / 0,5 / 1,33 detik (real / user / sys). rsync --stats --dry-run -ax ~ /xxxbutuh 4,4 / 3,1 / 2,1 detik. Itu untuk sekitar 500.000 file pada SSD.
langsing
Entah versi rsync apa yang Anda gunakan, tetapi dalam 3.1.2 ini sedikit lebih mudah dibaca:Number of files: 487 (reg: 295, dir: 192)
mpen
Saya menggunakan rsync default di macOS:rsync version 2.6.9 protocol version 29
psmith
20
Karena nama file di UNIX dapat berisi baris baru (ya, baris baru), wc -l mungkin menghitung terlalu banyak file. Saya akan mencetak titik untuk setiap file dan kemudian menghitung titik:
Sepertinya ini adalah satu-satunya solusi yang menangani file dengan baris baru di namanya. Terpilih.
codeforester
2
hihi :) Saya suka baris baru dalam nama file. Itu membuat mereka lebih mudah dibaca.
hek2mgl
Maksud saya, baris baru dalam nama file bukan konten!
codeforester
1
Saya hanya bercanda ... Ya, baris baru dalam nama file selalu harus diperhitungkan. Mereka bisa berasal dari konten jahat atau kurang spektakuler, dari kesalahan ketik.
hek2mgl
18
Menggabungkan beberapa jawaban di sini bersama-sama, solusi yang paling berguna tampaknya adalah:
Ini dapat menangani hal-hal aneh seperti nama file yang menyertakan kurung spasi dan bahkan baris baru. Ini juga mengurutkan output berdasarkan jumlah file.
Anda dapat menambah jumlahnya setelah -maxdepthmendapatkan sub direktori yang dihitung juga. Perlu diingat bahwa ini berpotensi memakan waktu lama, terutama jika Anda memiliki struktur direktori yang sangat bersarang dalam kombinasi dengan angka yang tinggi -maxdepth.
Ada apa dengan ini echo -e? Saya kira Anda memasukkannya ke dalam untuk melipat baris baru, tetapi juga akan memotong-motong spasi putih tidak teratur lainnya, dan mencoba untuk memperluas karakter wildcard yang ada di kata demi kata dalam nama file. Saya akan pergi dengan sesuatu seperti find .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'dan hidup dengan penyimpangan dalam output, atau mungkin bermain dengan Bash printf "%q"untuk mencetak nama direktori.
tripleee
10
Jika Anda ingin tahu berapa banyak file dan sub-direktori dari direktori kerja ini, Anda dapat menggunakan one-liner ini
Solusi yang sangat baik! Satu-satunya masalah yang saya temukan adalah direktori dengan spasi atau karakter khusus. Tambahkan kutipan di mana nama dir digunakan:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
John Kary
1
Saya telah memodifikasinya sedikit dan berfungsi dengan baik untuk saya:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek
Komentar saya pada jawaban @ Sebastian juga berlaku di sini. Penggunaan echo -e(atau hanya `echo` seperti dalam komentar sebelumnya) pada nama direktori yang tidak dikutip memperdagangkan satu masalah dengan yang lain.
tripleee
8
Jika Anda ingin menghindari kasus kesalahan, jangan izinkan wc -lmelihat file dengan baris baru (yang akan dihitung sebagai 2+ file)
mis. Pertimbangkan kasus di mana kita memiliki satu file dengan karakter EOL tunggal di dalamnya
> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2
Karena setidaknya gnu wctampaknya tidak memiliki opsi untuk membaca / menghitung daftar nol yang dihentikan (kecuali dari file), solusi termudah adalah dengan tidak memberikannya nama file, tetapi output statis setiap kali file ditemukan, misalnya dalam direktori yang sama seperti di atas
Anda bisa menggunakan perintah ncdu. Ini akan secara rekursif menghitung berapa banyak file yang berisi direktori Linux. Ini adalah contoh dari output:
Ini memiliki bilah kemajuan, yang nyaman jika Anda memiliki banyak file:
Itu terutama menghitung penggunaan disk, bukan jumlah file. Overhead tambahan ini kemungkinan tidak diinginkan. (Selain itu perlu menginstal paket tambahan untuk sesuatu yang dapat dilakukan dengan utilitas POSIX standar)
hek2mgl
@ hek2mgl Ini menghitung jumlah file, seperti yang ditunjukkan dengan warna merah di tangkapan layar pertama. Butuh beberapa menit untuk ~ 2 juta file, jadi kecepatannya tidak terlalu buruk.
Franck Dernoncourt
2
@ hek2mgl Saya menambahkan tolok ukur yang dapat direproduksi dalam jawabannya, saya menjalankannya dua kali dan saya tidak melihat perbedaan antara find . -type f | wc -ldan ncdu.
Franck Dernoncourt
2
ya, sepertinya findada di bawah tenda menjalankan lebih atau kurang panggilan sistem yang sama dengan duyang merupakan backend untuk ncdu. Baru saja mengikat mereka.
hek2mgl
1
@ FranckDernoncourt menyukainya. Saya punya banyak file dalam folder dan memiliki progress bar adalah penyelamat. Terima kasih telah berbagi!
Untuk menentukan berapa banyak file yang ada di direktori saat ini, masukkan ls -1 | wc -l. Ini digunakan wcuntuk melakukan hitungan jumlah baris (-l)dalam output ls -1. Itu tidak menghitung dotfile. Harap dicatat bahwals -l (itu "L" daripada "1" seperti pada contoh sebelumnya) yang saya gunakan dalam versi HOWTO ini sebelumnya akan benar-benar memberi Anda jumlah file yang lebih besar dari jumlah sebenarnya. Terima kasih kepada Kam Nejad untuk poin ini.
Jika Anda hanya ingin menghitung file dan TIDAK menyertakan tautan simbolik (hanya contoh apa yang bisa Anda lakukan), Anda bisa menggunakan ls -l | grep -v ^l | wc -l(itu "L" bukan "1" kali ini, kami ingin daftar "panjang" di sini) . grepmemeriksa baris yang dimulai dengan "l" (menunjukkan tautan), dan membuang baris itu (-v).
Kecepatan relatif: "ls -1 / usr / bin / | wc -l" membutuhkan waktu sekitar 1,03 detik pada 486SX25 yang tidak dimuat (/ usr / bin / pada mesin ini memiliki 355 file). "ls -l /usr/bin/ | grep -v ^l | wc -l " membutuhkan waktu sekitar 1,19 detik.
ls -lharus melakukan statsyscall pada setiap file untuk membaca ukurannya, mtime dan properti lainnya, yang lambat. Pada direktori besar (100.000+ file) menjalankan ls -ldapat memakan waktu beberapa menit. Jadi untuk hanya menghitung file, selalu gunakan ls -1 | wc -l.
Marki555
A 486SX25, bagus
cam8001
ls -1masih bisa lambat di direktori besar, karena harus mengurutkan file. Cukup printf '%s\n' *melakukan hal yang sama, dan menghindari lspanggilan eksternal (yang bermasalah bagaimanapun) tetapi soluton yang paling efisien adalah dengan menggunakan perintah yang tidak melakukan penyortiran, seperti find. (Output glob diurutkan berdasarkan shell.)
tripleee
4
Jika yang Anda butuhkan adalah menghitung jenis file tertentu secara rekursif , Anda dapat melakukannya:
find YOUR_PATH -name '*.html'-type f | wc -l
-l hanya untuk menampilkan jumlah baris dalam output.
Ekstensi adalah bagian dari nama file dan mungkin tidak mewakili file TYPE
Waxhead
4
Dengan bash:
Buat larik entri dengan () dan dapatkan hitungan dengan #.
FILES=(./*); echo ${#FILES[@]}
Ok itu tidak menghitung file secara rekursif tapi saya ingin menunjukkan opsi sederhana terlebih dahulu. Kasus penggunaan umum mungkin untuk membuat cadangan rollover file. Ini akan membuat logfile.1, logfile.2, logfile.3 dll.
CNT=(./logfile*); mv logfile logfile.${#CNT[@]}
Hitungan rekursif dengan bash 4+ globstardiaktifkan (seperti yang disebutkan oleh @tripleee)
FILES=(**/*); echo ${#FILES[@]}
Untuk mendapatkan jumlah file secara rekursif kita masih bisa menggunakan find dengan cara yang sama.
Kerang modern mendukung **/*penghitungan rekursif. Ini masih kurang efisien daripada finddi direktori besar karena shell harus mengurutkan file di setiap direktori.
tripleee
2
Untuk direktori dengan spasi pada namanya ... (berdasarkan berbagai jawaban di atas) - cetak nama direktori secara rekursif dengan jumlah file di dalamnya:
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
Contoh (diformat untuk dibaca):
pwd
/mnt/Vancouver/Programming/scripts/claws/corpus
ls -l
total 8
drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'
ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
138
## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
29
Struktur direktori lebih baik divisualisasikan menggunakan tree:
tree -L 3 -F .
.
├── Catabolism - Autophagy; Phagosomes; Mitophagy/
│ ├── 1
│ ├── 10
│ ├── [ ... SNIP! (138 files, total) ... ]
│ ├── 98
│ └── 99
└── Catabolism - Lysosomes/
├── 1
├── 10
├── [ ... SNIP! (28 files, total) ... ]
├── 8
├── 9
└── aaa/
└── bbb
3 directories, 167 files
man find | grep mindep
-mindepth levels
Do not apply any tests or actions at levels less than levels
(a non-negative integer). -mindepth 1 means process all files
except the starting-points.
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1
Applcation: Saya ingin mencari jumlah file maksimum di antara beberapa ratus direktori (all depth = 1) [output di bawah ini diformat lagi untuk dibaca]:
sort -Vadalah jenis alami. ... Jadi, jumlah maksimum file saya di salah satu direktori (Claws Mail) itu adalah 4.375 file. Jika saya meninggalkan-pad ( https://stackoverflow.com/a/55409116/1904943 ) nama-nama file - mereka semua dinamai secara numerik, dimulai dengan 1, di setiap direktori - dan pad hingga 5 digit total, saya harus baik-baik saja .
Tambahan
Temukan jumlah total file, subdirektori dalam direktori.
$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS
$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News
Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine
$ find . -type f | wc -l
70214 ## files
$ find . -type d | wc -l
417 ## subdirectories
Saya telah menulis ffcnt untuk mempercepat penghitungan file rekursif dalam keadaan tertentu: disk rotasi dan sistem file yang mendukung pemetaan luas.
Ini bisa menjadi urutan besarnya lebih cepat dari lsatau findberdasarkan pendekatan, tetapi YMMV.
Pertama-tama, ini tidak menjawab pertanyaan. Pertanyaannya adalah tentang penghitungan file secara rekursif dari direktori maju dan perintah yang Anda tunjukkan tidak melakukannya. selanjutnya, dengan ls Anda menghitung direktori serta file. Juga, tidak ada alasan untuk menjawab pertanyaan lama jika Anda tidak akan menambahkan sesuatu yang baru dan bahkan tidak akan membaca pertanyaan dengan benar. Harap jangan melakukannya.
XFCC
-1
Pendekatan alternatif dengan pemfilteran untuk format ini menghitung semua modul kernel grub yang tersedia:
¦
(ASCII 166) dengan bilah vertikal|
(ASCII 124) yang digunakan untuk pipa UNIX .*
karakter ASCII "tanda bintang", tetapi "waktu" dalam beberapa konteks lain.Jawaban:
Ini seharusnya bekerja:
Penjelasan:
-type f
untuk hanya menyertakan file.|
( dan tidak¦
) mengarahkanfind
output standarwc
perintah ke input standar perintah.wc
(kependekan dari jumlah kata) menghitung baris baru, kata dan byte pada inputnya ( dokumen ).-l
hanya menghitung baris baru.Catatan:
DIR_NAME
dengan.
untuk mengeksekusi perintah di folder saat ini.-type f
untuk memasukkan direktori (dan symlink) dalam hitungan.Penjelasan mengapa contoh Anda tidak berfungsi:
Pada perintah yang Anda tunjukkan, Anda tidak menggunakan "Pipa" (
|
) untuk menghubungkan dua perintah, tetapi bilah yang rusak (¦
) yang shell tidak kenali sebagai perintah atau yang serupa. Itu sebabnya Anda mendapatkan pesan kesalahan itu.sumber
f
dalam-type f
singkatan file danwc -l
untuk jalur jumlah kata.-type f
untuk memasukkan direktori dalam hitungan-print
bendera-print0
bendera.wc
memiliki opsi untuk membaca daftar nol yang dihentikan. Lihat jawaban saya untuk alternatif.Untuk direktori saat ini:
sumber
.
find .
Jika Anda ingin rincian berapa banyak file dalam setiap dir di bawah dir Anda saat ini:
Itu bisa dilakukan semua dalam satu baris, tentu saja. Tanda kurung mengklarifikasi keluaran siapa
wc -l
yang seharusnya ditonton (find $i -type f
dalam hal ini).sumber
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do
memperbaikinya. Lihat Bagaimana saya bisa membaca file (aliran data, variabel) baris demi baris (dan / atau bidang-demi-bidang)?find
untuk loop luar hanyalah komplikasi yang tidak perlu.for i in */
; do`Kamu bisa menggunakan
setelah menginstal paket tree dengan
(pada mesin Linux Debian / Mint / Ubuntu).
Perintah tidak hanya menampilkan jumlah file, tetapi juga jumlah direktori, secara terpisah. Opsi -L dapat digunakan untuk menentukan tingkat tampilan maksimum (yang, secara default, adalah kedalaman maksimum pohon direktori).
File tersembunyi juga dapat disertakan dengan menyediakan
-a
opsi.sumber
-a
opsi untuk memasukkannya.brew
dan jalankanbrew install tree
, lebih disukai setelah berjalanbrew update
.Di komputer saya,
rsync
sedikit lebih cepat daripadafind | wc -l
di jawaban yang diterima:Baris kedua memiliki jumlah file, 150.481 dalam contoh di atas. Sebagai bonus, Anda mendapatkan ukuran total juga (dalam byte).
Catatan:
--dry-run
(atau-n
singkatnya) penting untuk tidak benar-benar mentransfer file!-x
opsi untuk "jangan melewati batas filesystem", yang berarti jika Anda menjalankannya/
dan Anda memiliki hard disk eksternal yang terpasang, itu hanya akan menghitung file pada partisi root.sumber
find ~ -type f | wc -l
butuh 1,7 / 0,5 / 1,33 detik (real / user / sys).rsync --stats --dry-run -ax ~ /xxx
butuh 4,4 / 3,1 / 2,1 detik. Itu untuk sekitar 500.000 file pada SSD.Number of files: 487 (reg: 295, dir: 192)
rsync version 2.6.9 protocol version 29
Karena nama file di UNIX dapat berisi baris baru (ya, baris baru),
wc -l
mungkin menghitung terlalu banyak file. Saya akan mencetak titik untuk setiap file dan kemudian menghitung titik:sumber
Menggabungkan beberapa jawaban di sini bersama-sama, solusi yang paling berguna tampaknya adalah:
Ini dapat menangani hal-hal aneh seperti nama file yang menyertakan kurung spasi dan bahkan baris baru. Ini juga mengurutkan output berdasarkan jumlah file.
Anda dapat menambah jumlahnya setelah
-maxdepth
mendapatkan sub direktori yang dihitung juga. Perlu diingat bahwa ini berpotensi memakan waktu lama, terutama jika Anda memiliki struktur direktori yang sangat bersarang dalam kombinasi dengan angka yang tinggi-maxdepth
.sumber
echo -e
? Saya kira Anda memasukkannya ke dalam untuk melipat baris baru, tetapi juga akan memotong-motong spasi putih tidak teratur lainnya, dan mencoba untuk memperluas karakter wildcard yang ada di kata demi kata dalam nama file. Saya akan pergi dengan sesuatu sepertifind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'
dan hidup dengan penyimpangan dalam output, atau mungkin bermain dengan Bashprintf "%q"
untuk mencetak nama direktori.Jika Anda ingin tahu berapa banyak file dan sub-direktori dari direktori kerja ini, Anda dapat menggunakan one-liner ini
Ini akan berfungsi dalam GNU flavor, dan hanya menghilangkan -e dari perintah echo untuk BSD linux (misalnya OSX).
sumber
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
echo -e
(atau hanya `echo` seperti dalam komentar sebelumnya) pada nama direktori yang tidak dikutip memperdagangkan satu masalah dengan yang lain.Jika Anda ingin menghindari kasus kesalahan, jangan izinkan
wc -l
melihat file dengan baris baru (yang akan dihitung sebagai 2+ file)mis. Pertimbangkan kasus di mana kita memiliki satu file dengan karakter EOL tunggal di dalamnya
Karena setidaknya gnu
wc
tampaknya tidak memiliki opsi untuk membaca / menghitung daftar nol yang dihentikan (kecuali dari file), solusi termudah adalah dengan tidak memberikannya nama file, tetapi output statis setiap kali file ditemukan, misalnya dalam direktori yang sama seperti di atasAtau jika Anda
find
mendukungnyasumber
Anda bisa menggunakan perintah
ncdu
. Ini akan secara rekursif menghitung berapa banyak file yang berisi direktori Linux. Ini adalah contoh dari output:Ini memiliki bilah kemajuan, yang nyaman jika Anda memiliki banyak file:
Untuk menginstalnya di Ubuntu:
Benchmark: Saya menggunakan https://archive.org/details/cv_corpus_v1.tar (380390 file, 11 GB) sebagai folder di mana seseorang harus menghitung jumlah file.
find . -type f | wc -l
: sekitar 1m20s untuk menyelesaikanncdu
: sekitar 1m20s untuk menyelesaikansumber
find . -type f | wc -l
danncdu
.find
ada di bawah tenda menjalankan lebih atau kurang panggilan sistem yang sama dengandu
yang merupakan backend untukncdu
. Baru saja mengikat mereka.Output sampel:
sumber
Untuk menentukan berapa banyak file yang ada di direktori saat ini, masukkan
ls -1 | wc -l
. Ini digunakanwc
untuk melakukan hitungan jumlah baris(-l)
dalam outputls -1
. Itu tidak menghitung dotfile. Harap dicatat bahwals -l
(itu "L" daripada "1" seperti pada contoh sebelumnya) yang saya gunakan dalam versi HOWTO ini sebelumnya akan benar-benar memberi Anda jumlah file yang lebih besar dari jumlah sebenarnya. Terima kasih kepada Kam Nejad untuk poin ini.Jika Anda hanya ingin menghitung file dan TIDAK menyertakan tautan simbolik (hanya contoh apa yang bisa Anda lakukan), Anda bisa menggunakan
ls -l | grep -v ^l | wc -l
(itu "L" bukan "1" kali ini, kami ingin daftar "panjang" di sini) .grep
memeriksa baris yang dimulai dengan "l" (menunjukkan tautan), dan membuang baris itu (-v).Kecepatan relatif: "ls -1 / usr / bin / | wc -l" membutuhkan waktu sekitar 1,03 detik pada 486SX25 yang tidak dimuat (/ usr / bin / pada mesin ini memiliki 355 file). "
ls -l /usr/bin/ | grep -v ^l | wc -l
" membutuhkan waktu sekitar 1,19 detik.Sumber: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
sumber
ls -l
harus melakukanstat
syscall pada setiap file untuk membaca ukurannya, mtime dan properti lainnya, yang lambat. Pada direktori besar (100.000+ file) menjalankanls -l
dapat memakan waktu beberapa menit. Jadi untuk hanya menghitung file, selalu gunakanls -1 | wc -l
.ls -1
masih bisa lambat di direktori besar, karena harus mengurutkan file. Cukupprintf '%s\n' *
melakukan hal yang sama, dan menghindarils
panggilan eksternal (yang bermasalah bagaimanapun) tetapi soluton yang paling efisien adalah dengan menggunakan perintah yang tidak melakukan penyortiran, sepertifind
. (Output glob diurutkan berdasarkan shell.)Jika yang Anda butuhkan adalah menghitung jenis file tertentu secara rekursif , Anda dapat melakukannya:
-l
hanya untuk menampilkan jumlah baris dalam output.sumber
Dengan bash:
Buat larik entri dengan () dan dapatkan hitungan dengan #.
Ok itu tidak menghitung file secara rekursif tapi saya ingin menunjukkan opsi sederhana terlebih dahulu. Kasus penggunaan umum mungkin untuk membuat cadangan rollover file. Ini akan membuat logfile.1, logfile.2, logfile.3 dll.
Hitungan rekursif dengan bash 4+
globstar
diaktifkan (seperti yang disebutkan oleh @tripleee)Untuk mendapatkan jumlah file secara rekursif kita masih bisa menggunakan find dengan cara yang sama.
sumber
**/*
penghitungan rekursif. Ini masih kurang efisien daripadafind
di direktori besar karena shell harus mengurutkan file di setiap direktori.Untuk direktori dengan spasi pada namanya ... (berdasarkan berbagai jawaban di atas) - cetak nama direktori secara rekursif dengan jumlah file di dalamnya:
Contoh (diformat untuk dibaca):
Struktur direktori lebih baik divisualisasikan menggunakan
tree
:ls -p | grep -v /
(Digunakan di bawah) berasal dari jawaban 2 di /unix/48492/list-only-regular-files-but-not-directories-in-current-directoryApplcation: Saya ingin mencari jumlah file maksimum di antara beberapa ratus direktori (all depth = 1) [output di bawah ini diformat lagi untuk dibaca]:
sort -V
adalah jenis alami. ... Jadi, jumlah maksimum file saya di salah satu direktori (Claws Mail) itu adalah 4.375 file. Jika saya meninggalkan-pad ( https://stackoverflow.com/a/55409116/1904943 ) nama-nama file - mereka semua dinamai secara numerik, dimulai dengan 1, di setiap direktori - dan pad hingga 5 digit total, saya harus baik-baik saja .Tambahan
Temukan jumlah total file, subdirektori dalam direktori.
sumber
Saya telah menulis ffcnt untuk mempercepat penghitungan file rekursif dalam keadaan tertentu: disk rotasi dan sistem file yang mendukung pemetaan luas.
Ini bisa menjadi urutan besarnya lebih cepat dari
ls
ataufind
berdasarkan pendekatan, tetapi YMMV.sumber
Ada banyak jawaban yang benar di sini. Ini yang lain!
di mana
.
folder untuk melihat dan10
adalah jumlah karakter yang digunakan untuk mengelompokkan direktori.sumber
temukan -type f | wc -l
ATAU (Jika direktori adalah direktori saat ini)
Temukan . -type f | wc -l
sumber
Ini akan bekerja dengan baik. Sederhana pendek. Jika Anda ingin menghitung jumlah file yang ada dalam folder.
sumber
Pendekatan alternatif dengan pemfilteran untuk format ini menghitung semua modul kernel grub yang tersedia:
sumber
sumber