Saya memiliki sebuah direktori dengan file dalam jumlah besar. Saya don't melihat ls
switch untuk memberikan count. Ada beberapa baris perintah sihir untuk mendapatkan hitungan dari file?
Menggunakan definisi yang luas dari "berkas"
ls | wc -l
(perhatikan bahwa itu doesn't hitung hidden file dan mengasumsikan bahwa nama file don't mengandung karakter newline).
Untuk memasukkan file yang tersembunyi (kecuali .
dan ..
) dan menghindari masalah dengan karakter baris baru, kanonik adalah:
find . ! -name . -prune -print | grep -c /
Atau secara rekursif:
find .//. ! -name . -print | grep -c //
Untuk definisi sempit dari file:
find . -maxdepth 1 -type f | wc -l
Mungkin jawaban yang paling lengkap menggunakan ls
/wc
pasangan
ls -Aq | wc -l
jika anda ingin menghitung dot file, dan
ls -q | wc -l
sebaliknya.
-A
adalah untuk menghitung dot file, tetapi mengabaikan .
dan ..
.-q
membuat ls
ganti nongraphic karakter, khususnya karakter newline, dengan ?
, membuat output 1 baris untuk setiap fileUntuk mendapatkan satu baris output dari ls
di terminal (yaitu tanpa pipa itu ke wc
), -1
pilihan yang harus ditambahkan.
(perilaku ls
diuji dengan coreutils 8.23)
Jika anda tahu di direktori saat ini berisi setidaknya satu non-hidden file:
set -- *; echo "$#"
Ini jelas generalizable untuk setiap gumpal.
Dalam sebuah naskah, hal ini kadang-kadang efek samping yang malang menimpa parameter posisi. Anda dapat bekerja di sekitar itu dengan menggunakan subkulit atau dengan fungsi (Bourne/POSIX versi) seperti:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Solusi alternatif adalah $(ls -d -- * | wc -l)
. Jika glob adalah *
, perintah ini dapat disingkat menjadi $(ls | wc -l)
. Parsing output dari ls
selalu membuat saya gelisah, tapi di sini harus bekerja asalkan nama file anda don't berisi baris-baru, atau ls
lolos mereka. Dan $(ls -d - * 2>/dev/null | wc -l)
memiliki keuntungan dari penanganan kasus non-matching glob anggun (yaitu, kembali 0 dalam kasus itu, sedangkan set *
metode memerlukan mengesalkan pengujian jika glob mungkin kosong).
Jika nama file yang dapat berisi karakter baris baru, alternatif lain adalah dengan menggunakan $(ls -d ./* | grep -c /)
.
Salah satu solusi yang bergantung pada melewati perluasan glob untuk ls
mungkin gagal dengan argument daftar juga long kesalahan jika ada banyak file yang cocok.
Saya telah menemukan du --inode
berguna, tapi aku'm tidak yakin versi du
membutuhkan. Itu harus jauh lebih cepat daripada pendekatan alternatif menggunakan menemukan
dan wc
.
Pada Ubuntu 17.10, karya-karya berikut:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
Menggabungkan dengan | sort-nr
untuk mengurutkan turun dengan jumlah yang mengandung inode.
Setelah memasang pohon perintah, ketik saja:
pohon
Jika anda ingin file yang tersembunyi juga:
pohon -
Jika anda menggunakan Debian / Mint / Linux Ubuntu, ketik perintah berikut untuk menginstal pohon perintah:
sudo apt-get install pohon
Opsi -L digunakan untuk menentukan tampilan maksimum tingkat pohon direktori. Pohon perintah tidak hanya menghitung jumlah file, tetapi juga jumlah direktori, mengingat banyak tingkatan dari pohon direktori yang anda inginkan.
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
akan membuatnya non-rekursif, menemukan
adalah rekursif secara default-type f
akan menyertakan file hanya-printf .
adalah sentuhan lucu. mencetak dot untuk setiap file, bukan nama file, dan sekarang ini adalah mampu menangani nama file dan juga menyimpan data, kita hanya perlu menghitung titik-titik :)| wc -c
jumlah karakterBerikut ini's teknik lain sepanjang garis satu Gilles diposting:
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
yang menciptakan sebuah array dengan 13,923 elemen (jika itu's berapa banyak file yang ada).
Di Linux, untuk membuat perintah yang sangat kuat dan menangani file yang mungkin memiliki baris baru di nama mereka, gunakan ini:
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
Ini menyelamatkan kita dari cobaan parsing ls
output.
Terkait:
Meningkatkan beberapa jawaban yang diberikan sebelumnya, tapi kali ini melakukan secara eksplisit.
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
It's layak untuk melihat penggunaan beberapa mencintai perintah seperti ekor
dan cut
.
Juga, perhatikan bahwa pohon ini tidak tersedia secara default. Perintah di atas pertama yang bisa menangkap informasi tentang direktori di level 1, kemudian mendapatkan baris terakhir tail -n 1
di mana tujuan kami adalah, dan berakhir dengan cut
untuk mengambil kata ketiga.
Misalnya, menemukan di /
:
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
Lalu, bagaimana dengan menanyakan jumlah direktori?