"Ws - l <random file>" yerine "ls - l <random file>" bayt sayısı


25

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ü?


2
Bulduğun bu betiğe bir içerik verebilir misin?
Kusalananda

Yanıtlar:


13

Evet, böyle durumlar var.

Durumunda sembolik bağı GNU Linux sisteminde ls, ls -liken, bağlantının boyutunu koyacağız wc -cgerçek dosyayı çözmek ve orada bayt sayısını okuyacaktır. Aşağıda , asıl dosyada 172 bayt rapor ls -lederken, 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 /sysbirçok dosya boyutu 0 sahip olarak orada gösterecektir ls -l. /devDosya sistemi altında , karakter aygıtları ve blok aygıtları gibi çeşitli özel dosyalarımız var - wc -cbunlara 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 , 0bayt olarak bildirilir ls -c, ancak wc -caslı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 -lve wc -conlar da çalışmak ve nasıl farklılık gösterir. wc -caslında okumak için dosyayı açar ( strace wc -c /etc/passwdörneğin çalıştırırsanız bunu görebilirsiniz ). ls -lyalnızca stat()bunlarla arama yapar . Bu ayrıca neden /proc ls -l0 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 -cbunun yerine, o dosyanın içeriğini okur ve boyutunu hesaplar.

Son olarak, ls -lyalnı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 -cyerine kullanın.

Lütfen bir dosyanın komut dosyası yazmak ve değerlendirmek lsiç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 .


1
Küçük bir açıklama - Sanal dosyaları (içinde /sys/, /proc/vs.) olabilir sağlamak statuygulayı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 .
Toby Speight

11

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:

lsbelirli 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.

wcOkuma izinleri olmadan dosyaları için hiç çalışmaz, oysa olacak lsdizin listelemek için sadece izin gerekmiyor (karşılaştırmak ls -l /etc/shadowiç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 lssadece 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.


Okuma izinlerinden bahsetmek için +1 ve seek(). strace wc -lBirkaç büyük dosya üzerinde çalıştıktan sonra durum böyle görünüyor .
Sergiy Kolodyazhnyy

Cevabımdan çok daha fazla ayrıntı eklemek için +1!
Cyclic3

6

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.


2
wc -cbenim için en azından arar fstat, ancak görünüşte başka amaçlar için. Dosyanın uzunluğunu lseeksonuna kadar bulur . Bunun bir hata vermesi durumunda, readdosyanın tamamı.
Muzer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.