Ne zaman olası bir durum var mı
ls -l file.txt
aynı bayt sayısını göstermiyor
wc -c file.txt
Bir komut dosyasında bu iki değerin karşılaştırmasını buldum. Bunun nedeni ne olabilir? Aynı dosyanın farklı bayt sayıları olması bile mümkün mü?
Ne zaman olası bir durum var mı
ls -l file.txt
aynı bayt sayısını göstermiyor
wc -c file.txt
Bir komut dosyasında bu iki değerin karşılaştırmasını buldum. Bunun nedeni ne olabilir? Aynı dosyanın farklı bayt sayıları olması bile mümkün mü?
Yanıtlar:
Evet, böyle durumlar var.
Durumunda sembolik bağı GNU Linux sisteminde ls
, ls -l
iken, bağlantının boyutunu koyacağız wc -c
gerçek dosyayı çözmek ve orada bayt sayısını okuyacaktır. Aşağıda , asıl dosyada 172 bayt rapor ls -l
ederken, 29 bayt rapor ettiğini görebilirsiniz wc
.
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 1月 17 2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf
-rw-r--r-- 1 root root 172 1月 15 15:49 /var/run/resolvconf/resolv.conf
Durumunda sanal dosya sistemleri , gibi/proc
veya /sys
birçok dosya boyutu 0 sahip olarak orada gösterecektir ls -l
. /dev
Dosya sistemi altında , karakter aygıtları ve blok aygıtları gibi çeşitli özel dosyalarımız var - wc -c
bunlara bağlı kalıyor ve büyüklük yerine büyük ve küçük sayılarıls -l
gösteriyor .
Adlandırılmış borular , 0
bayt olarak bildirilir ls -c
, ancak wc -c
aslında borunun içeriğini okuyacaktır, bu nedenle teknik olarak adlandırılmış boruda ne kadar veri olduğunu size söyleyecektir:
$ mkfifo named.pipe
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月 16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done echo "This is a test" >named.pipe
Normal dosyalar için boyut eşit olmalıdır.
Noktası ls -l
ve wc -c
onlar da çalışmak ve nasıl farklılık gösterir. wc -c
aslında okumak için dosyayı açar ( strace wc -c /etc/passwd
örneğin çalıştırırsanız bunu görebilirsiniz ). ls -l
yalnızca stat()
bunlarla arama yapar . Bu ayrıca neden /proc
ls -l
0 boyut gösterdiğini de açıklıyor - bu dosyaları "gerçek" olmadıkları için veya aslında sabit diskte / ssd'de depolanmadıkları için duramazsınız. wc -c
bunun yerine, o dosyanın içeriğini okur ve boyutunu hesaplar.
Son olarak, ls -l
yalnızca etkileşimli öğeleri listelemek için bir araçtır. Kod yazımı için nadiren iyi bir seçimdir. Verileri okumanız gerektiğinde, wc -c
yerine kullanın.
Lütfen bir dosyanın komut dosyası yazmak ve değerlendirmek ls
için en iyi aday olmadığını unutmayın. Aslında, çıktıların ayrıştırılmasını önlemekls
yaygın uygulamalardan biridir . Lütfen du -b
bir dosyanın boyutunu bulmak için kullanın .
/sys/
, /proc/
vs.) olabilir sağlamak stat
uygulayıcısı seçerse için, bilgi. Çoğu zaman, zorlayıcı bir sebep yoktur, bu yüzden ihmal edilir. Örneklenebilecekler /proc/kcore
, adreslenebilir çekirdek belleğin (genellikle mevcut fiziksel bellekten çok daha fazla) boyutu olarak bildirilenleri içerir .
ls -l
dosya sistemi tarafından bildirilen dosyanın boyutunu döndürür.
wc -c
'gerçek' boyutu belirlemek için dosyayı okumaya çalışacaktır. Gözlemlerime göre, ilk önce sonuna kadar aramaya çalışıyor gibi görünüyor ve eğer bu işe yaramazsa, büyüklüğü olduğu gibi sayarak tüm dosyayı okuyacak.
Bu, iki aletin ne yaptığıyla ilgili basit bir tanımdır, ancak sonuçlar için bir takım sonuçlara yol açmaktadır:
ls
belirli dosya sistemleri için hatalı çıktı verir. Örneğin, sanallaştırılmış dosya sistemleri /proc
, birçok dosya için sıfır büyüklüğünü rapor eder, çünkü bu "dosyalar" fiziksel olarak hiçbir yerde saklanmaz; Yazılımın gerektirdiği şekilde üretilirler.
wc
Okuma izinleri olmadan dosyaları için hiç çalışmaz, oysa olacak ls
dizin listelemek için sadece izin gerekmiyor (karşılaştırmak ls -l /etc/shadow
için wc -c /etc/shadow
).
Diğer cevaplarda belirtildiği gibi, sembolik bağların davranışı da farklıdır. Çünkü wc
çalışır onları okumak için, bu sürüm numarasını tekrar, çünkü oysa ki dosyayı okuma biter ls
sadece dosya sistemini sorgular, sembolik bağlantının kendisini saklamak için kullanılan boyutunu bildirir.
Henüz düşünmediğim başka farklılıklar olduğuna eminim, ancak bu farklılıkların arkasındaki temel sebeple ilgili açık ve basit bir açıklama yapacağımı düşündüm.
seek()
. strace wc -l
Birkaç büyük dosya üzerinde çalıştıktan sonra durum böyle görünüyor .
Normal bir dosya için ls ve wc call stat. Ancak, / proc veya / sys dosyalarında ls 0 döndürür, ancak wc farklı bir sayı döndürür:
$ ls -l /proc/modules
-r--r--r-- 1 root root 0 Jan 16 14:56 modules
^ this one
$ wc -c /proc/modules
7621 modules
Bu muhtemelen bir şeyin özel bir dosya olup olmadığını öğrenmenin bir yoludur.
wc -c
benim için en azından arar fstat
, ancak görünüşte başka amaçlar için. Dosyanın uzunluğunu lseek
sonuna kadar bulur . Bunun bir hata vermesi durumunda, read
dosyanın tamamı.