it-swarm-id.com

Bagaimana saya bisa mendapatkan jumlah file dalam direktori menggunakan baris perintah?

Saya memiliki direktori dengan banyak file. Saya tidak melihat sakelar ls untuk memberikan hitungan. Apakah ada sihir baris perintah untuk mendapatkan hitungan file?

219
Blake

Menggunakan definisi "file" yang luas

ls | wc -l

(perhatikan bahwa itu tidak menghitung file tersembunyi dan menganggap bahwa nama file tidak mengandung karakter baris baru).

Untuk memasukkan file tersembunyi (kecuali . dan ..) dan menghindari masalah dengan karakter baris baru, cara kanonik adalah:

find . ! -name . -Prune -print | grep -c /

Atau secara rekursif:

find .//. ! -name . -print | grep -c //
279
James Roth

Untuk definisi file yang sempit:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: Catatan ls - <number-one> | wc - <letter-l>

15
nicomen

Saya telah menemukan du --inodes bermanfaat, tapi saya tidak yakin versi du mana yang dibutuhkan. Itu harus jauh lebih cepat daripada pendekatan alternatif menggunakan find dan wc.

Di Ubuntu 17.10, yang berikut ini berfungsi:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Gabungkan dengan | sort -nr untuk mengurutkan menurun berdasarkan jumlah inode yang mengandung.

12
krlmlr

Mungkin jawaban yang paling lengkap menggunakan pasangan ls/wc adalah

ls -Aq | wc -l

jika Anda ingin menghitung file dot, dan

ls -q | wc -l

jika tidak.

  • -A adalah untuk menghitung file dot, tetapi mengabaikan . dan ...
  • -q make ls ganti karakter nongraphic, khususnya karakter baris baru, dengan ?, membuat output 1 baris untuk setiap file

Untuk mendapatkan output satu baris dari ls di terminal (mis. Tanpa menyalurkannya ke wc), -1 opsi harus ditambahkan.

(perilaku ls diuji dengan coreutils 8.23)

12
Frax

Jika Anda tahu direktori saat ini mengandung setidaknya satu file yang tidak disembunyikan:

set -- *; echo "$#"

Ini jelas dapat digeneralisasikan untuk semua bola.

Dalam sebuah skrip, ini memiliki efek samping yang kadang-kadang tidak menguntungkan yaitu menimpa parameter posisi. Anda dapat mengatasinya dengan menggunakan subkulit atau dengan fungsi (versi Bourne/POSIX) 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 dapat disingkat menjadi $(ls | wc -l). Mem-parsing keluaran ls selalu membuat saya gelisah, tetapi di sini ia akan berfungsi selama nama file Anda tidak mengandung baris baru, atau ls Anda lolos darinya. Dan $(ls -d -- * 2>/dev/null | wc -l) memiliki keuntungan menangani kasus gumpalan yang tidak cocok dengan anggun (yaitu, mengembalikan 0 dalam kasus itu, sedangkan metode set * Memerlukan pengujian fiddly jika gumpalan mungkin kosong ).

Jika nama file dapat berisi karakter baris baru, alternatifnya adalah menggunakan $(ls -d ./* | grep -c /).

Salah satu solusi yang mengandalkan meneruskan ekspansi bola ke ls dapat gagal dengan daftar argumen terlalu panjang kesalahan jika ada banyak file yang cocok.

Saat menggunakan pasangan ls/wc jika kita menambahkan -U itu akan jauh lebih cepat (jangan urutkan).

ls -AqU | wc -l
5
Jbnair

Setelah menginstal perintah tree, ketikkan:

tree

Jika Anda ingin file tersembunyi juga:

tree -a

Jika Anda menggunakan Linux Debian/Mint/Ubuntu, ketikkan perintah berikut untuk menginstal perintah pohon:

Sudo apt-get install tree

Opsi -L digunakan untuk menentukan level tampilan maksimum pohon direktori. Perintah tree tidak hanya menghitung jumlah file, tetapi juga jumlah direktori, mengingat sebanyak level pohon direktori yang Anda inginkan.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 akan menjadikannya non-rekursif, find bersifat rekursif secara default
  • -type f hanya akan menyertakan file
  • -printf . adalah sentuhan imut. ia mencetak titik untuk setiap file, bukan nama file, dan sekarang ini dapat menangani nama file apa pun dan juga menyimpan data; kita hanya harus menghitung titik-titik :)
  • | wc -c menghitung karakter
3
aude

Tidak ada pipa, tidak ada salinan string, tidak ada garpu, hanya bash polos satu liner

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

Di Linux, untuk membuat perintah sangat kuat dan menangani file yang mungkin memiliki baris baru dalam namanya, gunakan ini:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Ini menyelamatkan kita dari cobaan dari parsing ls output.


Terkait:

1
codeforester

Berikut teknik lain di sepanjang baris satu posting Gilles :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

yang menciptakan array dengan 13.923 elemen (jika ada berapa banyak file).

find . -type f -maxdepth 1 |  wc -l 

Ini hanya dapat menampilkan file dalam direktori saat ini.

1
srpatch

Meningkatkan beberapa jawaban yang diberikan sebelumnya tetapi kali ini dilakukan secara eksplisit.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Layak untuk memperhatikan penggunaan beberapa perintah yang dicintai seperti tail dan cut. Juga, perhatikan bahwa pohon tidak tersedia secara default. Perintah di atas pertama-tama menangkap informasi tentang direktori pada level 1, lalu dapatkan baris terakhir tail -n 1 di mana tujuan kami, dan berakhir dengan cut untuk mengambil kata ketiga.

Misalnya, mencari 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?

0
jonaprieto

Coba ini saya harap jawaban ini akan membantu Anda

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Anda dapat memeriksa dengan:

ls -l | grep -v ^l | wc -l
0
AMIC MING