Pertanyaan sederhana, tapi saya tidak yakin ke mana harus mencari dan google tidak menanggapi titik dan garis miring.
Saya hanya mencoba menghitung # file & direktori di direktori saat ini (tidak termasuk subfolder / file) dan berusaha untuk membedakan ls -1 | wc -l
dan ls | wc -l
karena mereka tampak identik. Sebuah situs yang saya lihat berkata "Ingatlah bahwa ini juga menghitung direktori ./ dan ../." mengenai satu dengan ls -1
, dan saya tidak yakin apakah itu berarti termasuk direktori sebelumnya atau sesuatu (yang saya tidak mau), tetapi tampaknya tidak melakukan itu dari pengujian.
Bisakah seseorang mengkonfirmasi mana dari mereka yang paling memadai untuk menghitung # file & direktori di direktori saat ini saja (bukan sub) dan apa artinya dengan direktori ./ dan ../?
Jawaban:
Setiap direktori pada sistem Unix (dan mungkin juga setiap sistem lainnya) mengandung setidaknya dua entri direktori. Ini adalah
.
(direktori saat ini) dan..
(direktori induk). Dalam kasus direktori root, ini menunjuk ke tempat yang sama, tetapi dengan direktori lain, mereka berbeda. Anda bisa melihatnya sendiri menggunakan perintahstat
,pwd
dancd
(di Linux):Perhatikan itu
bin
dansbin
masing - masing memiliki dua tautan ke sana. Satu adalah entri direktori di direktori root, dan yang lainnya adalah.
entri di dalam direktori itu.Menggunakan
ls
dengan pipawc -l
adalah trik sederhana untuk menghitung jumlah garis dalam output ls '. Asumsinya adalah bahwa setiap file atau direktori akan menempati tepat satu baris dalam output. GNU akan, ketika outputnya adalah non-terminal, melakukan ini secara otomatis; yang lain mungkin perlu-1
opsi untuk mengaktifkan perilaku secara eksplisit.wc -l
hanya menghitung dan menampilkan jumlah baris (-l
) pada inputnya.Masalah dengan pendekatan itu adalah bahwa di Linux dan pada sistem file yang secara tradisional digunakan di Linux, nama file dan direktori (mereka benar-benar satu dan sama dalam hal ini) diperbolehkan mengandung karakter baris baru . Di hadapan mereka, salah satu metode berantakan - entri tersebut akan dihitung sebagai dua atau lebih entri ketika pada kenyataannya mereka adalah satu.
Selama Anda menggunakan GNU ls, tidak memiliki entri direktori dengan nama yang mengandung karakter baris baru, dan tidak memiliki alias aneh untuk
ls
(misalnya,ls -a
), keduanya akan menampilkan jumlah file dan direktori dalam direktori saat ini (atau ditentukan). Bagi kebanyakan orang, ini cukup baik, tetapi tidak berlaku dalam kasus umum .Jika Anda perlu menangani karakter yang tidak biasa (terutama baris baru) dalam nama entri direktori dengan benar, saya sarankan menggunakan
-b
opsi ls untuk menghindarinya.ls -1bA
akan mencetak setiap nama entri direktori pada barisnya masing-masing, keluar dari karakter yang tidak biasa (sehingga setiap entri direktori akan terlihat sebagai satu), termasuk dotfiles dan -directories. Tack onwc -l
untuk baris perintah lengkapls -1bA | wc -l
yang akan melaporkan jumlah file dan direktori di direktori saat ini (tetapi abaikan.
dan..
; itulah perbedaan antara-a
dan-A
), tetapi tidak turun ke subdirektori mana pun. Jika Anda tidak ingin ada dotfile yang dihitung terhadap total, cukup abaikan-A
parameternyals
.sumber
-a
dan-A
termasuk file tersembunyi juga yang saya sadari saya ingin hindari, jadi paling banyak saya akan melakukannyals -b | wc -l
, tetapi ini memberi saya jawaban yang tepat. Apakah baris yang saya salin dan tempel tentang perintah ini salah? Jika itu benar, bukankah seharusnya saya mendapatkan output 8 ketika ada 6 file atau folder dalam direktori?mkdir()
panggilan sistem. Tidak semua filesystem memilikinya dan bahkan tidak diperlukan atau diharuskan oleh POSIX.Untuk menjawab pertanyaan dalam subjek:
Ketika direktori B dibuat di Unix, itu ditambahkan sebagai entri baru ke direktori A lain (direktori induknya), dan di B, dua entri ditambahkan: satu disebut
.
sebagai tautan keras ke dirinya sendiri, dan satu disebut..
sebagai hard tautan ke A.Itu adalah satu-satunya tautan keras ke direktori yang diizinkan (meskipun beberapa versi lebih tua dari beberapa UNICE juga mengizinkan tautan sewenang-wenang).
itu sebabnya dengan sebagian besar sistem file (
btrfs
menjadi pengecualian), jumlahlinks
direktori adalah indikasi dari berapa banyak subdirektori yang dimilikinya (akuntansi untuk..
entri mereka ).Saat Anda mengganti nama / memindahkan direktori, jika itu ke direktori yang sama (dengan nama yang berbeda), hanya entri nama
A
yang diubah. B.
dan..
tidak terpengaruh. Tapi jika Anda memindahkannya melakukan direktori yang berbeda, maka..
diB
akan berubah. Itu menjelaskan mengapa Anda dapat mengganti nama direktori di mana Anda tidak memiliki akses tulis (dengan asumsi Anda memiliki akses tulis ke direktori induk) hanya selama Anda tidak memindahkannya ke direktori lain (jika tidak, kebutuhan untuk mengubah..
entri mencegah Anda memindahkannya).Berhati-hatilah:
/a/b/../c
mungkin tidak sama dengan/a/c
karena/a/b
mungkin merupakan tautan simbolis ke beberapa direktori lain.Pengecualian untuk itu adalah ketika path itu diberikan ke
cd
perintah untuk beberapa shell. Merekacd
memperlakukan..
secara logis mengabaikan..
entri dalam direktori. Alasan mengapa Anda sering melihatcd -P
dalam skrip yang ditulis dengan benar, untuk menonaktifkan fitur yang dapat menyebabkan kebingungan dan inkonsistensi.Untuk menghitung jumlah entri dalam direktori saat ini tidak termasuk
.
dan..
denganbash
, Anda dapat melakukan:Dengan zsh:
Mudah dibawa:
sumber
ls | wc -l
hanya ada satu yang mengecualikan.
dan..
ls
tidak mencantumkan file tersembunyi. Anda harusls -A
mendapatkan yang sama seperti itu. JIKA Anda tidak ingin menghitung file yang disembunyikan, lepasdotglob
(untuk bash) atauD
(untuk zsh) atau tambahkan! -name '.*'
sebelum-print
untukfind
.ls | wc -l
masih memberi saya jawaban yang benar dan mengecualikan file tersembunyi,.
&..
?.
,..
dan file lain yang namanya dimulai dengan.
yang tidak terdaftar oleh ls tetapi akan olehls -A
. Jadils | wc -l
tidak memberi Anda jawaban yang benar karena tidak menghitung file tersembunyi itu..
dan..
merupakan file tersembunyi sejak dimulai dengan a.
. Bahkan ada legenda yang menjelaskan bahwa dotfiles disembunyikan secara tidak sengaja karena implementasi awalls
dimaksudkan hanya untuk mengecualikan.
dan..
, tetapi ada bug yang menyebabkannya mengecualikan file yang dimulai dengan.
.ls | wc -l
tidak berfungsi jika nama file mengandung karakter baris baru.Saya bukan ahli Linux yang hebat, tapi saya tahu Linux (dulu administrator 16 tahun yang lalu, di Slackware :) waktu yang lama
direktori ./ dan ../ sederhana:. adalah direktori saat ini, .. adalah direktori sebelumnya (di pohon pwd -local directory command-
Jika itu menghitungnya, saya rasa mereka menambahkan 2 ke total daftar, tidak benar-benar pergi secara rekursif dan menghitung direktori di bawah yang sekarang, dan juga menghitung lagi direktori saat ini (.) :))
Jadi pada dasarnya saya pikir itu menambah nilai 2 untuk sudah menghitung (file) dalam direktori saat ini.
Ada yang benar kalau aku salah.
Saya hanya memposting untuk membantu dan melihat bahwa tidak ada yang menjawab pertanyaan ini di sini, mereka mungkin sibuk. Tapi coba saja dan lihat apakah Anda memiliki 10 file dan dapatkan hitungan 12 maka itu saja.
sumber
ls | wc -1
ls | wc -l
memasukkan.
dan..
ketika saya mendapatkan jawaban yang benar, sebagai lawan dari jawaban yang tepat + 2.