Saya memiliki direktori dengan banyak file. Saya tidak melihat ls
saklar untuk memberikan hitungan. Apakah ada sihir baris perintah untuk mendapatkan hitungan file?
command-line
Blake
sumber
sumber
tree . | tail
atautree -a . | tail
untuk memasukkan file / direktori tersembunyi,tree
bersifat rekursif jika itu yang Anda inginkan.Jawaban:
Menggunakan definisi luas "file"
(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:Atau secara rekursif:
sumber
wc
adalah program "jumlah kata". The-l
beralih menyebabkannya untuk menghitung garis. Dalam hal ini, ia menghitung garis dalam output darils
. Ini selalu cara saya diajarkan untuk mendapatkan jumlah file untuk direktori yang diberikan juga.ls
berfungsils -1
jika outputnya berupa pipa.ls -la
, Anda akan mendapatkan tiga baris dalam direktori. Anda inginls -lA | wc -l
melewati.
dan..
entri. Anda akan tetap off-by-one.ls -q | wc -l
- meskipun perhatikan bahwa file tersembunyi masih tidak akan dihitung oleh pendekatan ini, dan direktori akan dihitung.Untuk definisi file yang sempit:
sumber
-maxdepth 1
untuk menghitung file secara rekursif (atau menyesuaikannya untuk kedalaman pencarian maks yang diinginkan).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: Catatan ls - <nomor-one> | wc - <letter-l>
sumber
ls
dilakukan-1
secara otomatis ketika output ke pipa.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Mungkin jawaban yang paling lengkap menggunakan
ls
/wc
pair adalahjika Anda ingin menghitung file dot, dan
jika tidak.
-A
adalah untuk menghitung file dot, tetapi hilangkan.
dan..
.-q
membuatls
ganti karakter nongraphic, khususnya karakter baris baru, dengan?
, membuat output 1 baris untuk setiap fileUntuk mendapatkan output satu jalur dari
ls
dalam terminal (yaitu tanpa memasukkannya ke dalamwc
),-1
opsi harus ditambahkan.(perilaku
ls
diuji dengan coreutils 8.23)sumber
-1
tidak diperlukan. Mengenai "ia menangani baris baru dalam nama file dengan masuk akal dengan output konsol" , ini karena-q
sakelar (yang harus Anda gunakan alih-alih-b
karena portabel) yang "memaksa setiap instance karakter nama file yang tidak dapat dicetak dan karakter <tab> yang akan ditulis sebagai karakter <question-mark> ('?'). Implementasi dapat menyediakan opsi ini secara default jika outputnya ke perangkat terminal. " Jadi mis.ls -Aq | wc -l
Untuk menghitung semua file / direktori atauls -qp | grep -c /
untuk menghitung hanya direktori yang tidak tersembunyi, dll ...-b
menjadi-q
.Jika Anda tahu direktori saat ini mengandung setidaknya satu file yang tidak disembunyikan:
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:
Solusi alternatif adalah
$(ls -d -- * | wc -l)
. Jika glob adalah*
, perintah dapat disingkat menjadi$(ls | wc -l)
. Mem-parsing outputls
selalu membuat saya gelisah, tapi di sini seharusnya berfungsi selama nama file Anda tidak mengandung baris baru, atau Andals
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, sedangkanset *
metode ini membutuhkan 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 dunia
ls
mungkin gagal dengan daftar argumen kesalahan terlalu lama jika ada banyak file yang cocok.sumber
local
atau menghilangkannya:eval $1=$#
atau hanya menggunakanecho $#
dan melakukannumber_of_files=$(count_words *)
.$#
(Anda belum melakukan itu sebelum edit)?$1
. Jadi yang ingin saya hitung adalah jumlah parameter yang bukan parameter pertama. (Saya tidak bisa menggunakanshift
karena saya harus menjaga nama variabel tetap ada.) (Umm, sekarang jika Anda bertanya tentang baris pertama ...)shift
jika saya mengatur waktu dengan benar.Saya menemukan
du --inodes
bermanfaat, tetapi saya tidak yakin versi mana yangdu
dibutuhkan. Itu harus jauh lebih cepat daripada pendekatan alternatif menggunakanfind
danwc
.Di Ubuntu 17.10, yang berikut ini berfungsi:
Gabungkan dengan
| sort -nr
untuk mengurutkan menurun berdasarkan jumlah inode yang mengandung.sumber
Saat menggunakan pasangan ls / wc jika kita menambahkan -U akan jauh lebih cepat (jangan urutkan).
sumber
-U
khusus untuk GNU.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.
sumber
-maxdepth 1
akan membuatnya non-rekursif,find
bersifat rekursif secara default-type f
hanya akan menyertakan file-printf .
adalah sentuhan imut. itu 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 karaktersumber
Tidak ada pipa, tidak ada salinan string, tidak ada garpu, hanya bash polos satu liner
sumber
Berikut teknik lain yang ditulis oleh Gilles :
yang menciptakan array dengan 13.923 elemen (jika ada berapa banyak file).
sumber
c
array itu?word_count() { echo "$#"; }
akan cukup. Inti dari solusi @Gilles adalah untuk menyimpan hitungan dalam variabel yang dikembalikan untuk menghindari keharusan menggunakan substitusi perintah (yang melibatkan garpu dan pipa dalam cangkang selain ksh93).Ini hanya dapat menampilkan file dalam direktori saat ini.
sumber
find . -type f
akan menemukan file di direktori saat ini, dan juga, secara rekursif, di sub-direktori.Coba ini saya harap jawaban ini akan membantu Anda
sumber
Anda dapat memeriksa dengan:
sumber
Meningkatkan beberapa jawaban yang diberikan sebelumnya tetapi kali ini dilakukan secara eksplisit.
Layak untuk memperhatikan penggunaan beberapa perintah yang dicintai seperti
tail
dancut
. Juga, perhatikan bahwa pohon tidak tersedia secara default. Perintah di atas pertama-tama menangkap informasi tentang direktori pada level 1, lalu dapatkan baris terakhir ditail -n 1
mana tujuan kita, dan berakhir dengancut
mengambil kata ketiga.Misalnya, mencari di
/
:Lalu, bagaimana dengan menanyakan jumlah direktori?
sumber
Di Linux, untuk membuat perintah sangat kuat dan menangani file yang mungkin memiliki baris baru dalam namanya, gunakan ini:
Ini menyelamatkan kita dari cobaan
ls
keluaran parsing .Terkait:
sumber
Gunakan
tree
perintah, cukup:sumber