Apakah ada situasi yang memungkinkan ketika
ls -l file.txt
tidak menunjukkan jumlah byte yang sama dengan
wc -c file.txt
Dalam satu skrip saya menemukan perbandingan kedua nilai tersebut. Apa yang bisa menjadi alasan itu? Apakah mungkin untuk memiliki jumlah byte yang berbeda dari file yang sama?
Jawaban:
Ya, ada beberapa kasus seperti itu.
Dalam kasus symlink pada sistem Linux dengan GNU
ls
,ls -l
akan mengeluarkan ukuran tautan, sementarawc -c
akan menyelesaikan file aktual dan membaca jumlah byte di sana. Di bawah ini Anda dapat melihat bahwals -l
laporan 29 byte, sedangkanwc
laporan 172 byte di file yang sebenarnya.Dalam hal sistem file virtual , seperti
/proc
atau/sys
, banyak file di sana akan menunjukkan memiliki ukuran 0ls -l
. Di bawah/dev
sistem file, kami memiliki beragam file khusus, seperti perangkat karakter dan perangkat blok -wc -c
menggantungnya danls -l
menunjukkan angka-angka besar dan kecil alih-alih ukuran.Pipa yang dinamai akan dilaporkan sebagai
0
byte olehls -c
, tetapiwc -c
sebenarnya akan membaca isi pipa, jadi secara teknis akan memberi tahu Anda berapa banyak data dalam pipa bernama:Untuk file biasa, ukurannya harus sama.
Titik
ls -l
danwc -c
, dan cara kerjanya juga berbeda.wc -c
sebenarnya membuka file untuk dibaca (Anda dapat melihat bahwa jika Anda menjalankanstrace wc -c /etc/passwd
misalnya).ls -l
hanya melakukanstat()
panggilan pada mereka. Ini juga menjelaskan mengapa dalam/proc
ls -l
menunjukkan ukuran 0 - Anda tidak dapat membuat stat file-file itu karena mereka tidak "asli" atau benar-benar disimpan pada hard-drive / ssd.wc -c
alih-alih, baca konten file itu, dan hitung ukurannya.Akhirnya,
ls -l
hanya alat untuk mendaftarkan item secara interaktif. Jarang cocok untuk skrip. Saat Anda benar-benar perlu membaca data, gunakanwc -c
saja.Harap dicatat, bahwa untuk skrip dan menilai ukuran file,
ls
bukan kandidat terbaik. Sebenarnya, ini adalah salah satu praktik umum untuk menghindari penguraianls
output . Silakan gunakandu -b
untuk mengetahui ukuran file.sumber
/sys/
,/proc/
, dll) dapat memberikanstat
informasi, jika lagi memilih pelaksana. Sebagian besar waktu, tidak ada alasan kuat untuk itu, jadi itu dihilangkan. Contohnya termasuk/proc/kcore
yang dilaporkan sebagai ukuran memori kernel addressable (biasanya jauh lebih banyak daripada memori fisik yang tersedia).ls -l
akan mengembalikan ukuran file yang dilaporkan oleh sistem file.wc -c
akan berusaha membaca file untuk menentukan ukuran 'aktual'. Dari pengamatan saya tampaknya pertama mencoba mencari sampai akhir, dan jika ini tidak berhasil, itu akan membacakan seluruh file, menghitung ukuran saat berjalan.Ini adalah deskripsi sederhana tentang apa yang dilakukan kedua alat, tetapi mengarah ke sejumlah implikasi untuk hasil:
ls
akan memberikan output yang salah untuk sistem file tertentu. Sebagai contoh, sistem file tervirtualisasi seperti/proc
akan melaporkan ukuran nol untuk banyak file, karena "file" ini tidak disimpan secara fisik di mana pun; mereka dihasilkan sesuai kebutuhan oleh perangkat lunak.wc
tidak akan berfungsi sama sekali untuk file tanpa izin baca, sedangkanls
hanya memerlukan izin untuk mendaftar direktori (bandingkanls -l /etc/shadow
denganwc -c /etc/shadow
).Seperti disebutkan dalam jawaban lain, perilaku tautan simbolik juga berbeda. Karena
wc
mencoba membacanya, akhirnya membaca file yang ditunjuk symlink, sedangkan karenals
hanya menanyakan filesystem, ia akan melaporkan ukuran yang digunakan untuk menyimpan tautan simbolik itu sendiri.Saya yakin ada perbedaan lain yang belum saya pikirkan, tetapi saya pikir saya akan memberikan penjelasan yang jelas dan sederhana tentang alasan dasar di balik perbedaan ini.
sumber
seek()
. Ini tampaknya menjadi masalah, setelah dijalankanstrace wc -l
pada beberapa file besar.Untuk file normal, ls dan stat panggilan wc. Namun, untuk file / proc atau / sys, ls mengembalikan 0, tetapi wc mengembalikan nomor yang berbeda:
Ini mungkin beberapa cara untuk mencari tahu apakah ada file khusus.
sumber
wc -c
bagi saya setidaknya panggilanfstat
, tetapi tampaknya untuk tujuan lain. Itu menemukan panjang file denganlseek
ing sampai akhir. Jika ini mengembalikan kesalahan, ituread
adalah seluruh file.