"Ls -l <random file>" बनाम "wc -c <random file>" की बाइट गिनती


25

क्या कोई संभावित स्थिति है जब

ls -l file.txt

के रूप में बाइट्स की एक ही संख्या नहीं दिखा रहा है

wc -c file.txt

एक स्क्रिप्ट में मैंने उन दो मूल्यों की तुलना की। इसका क्या कारण हो सकता है? क्या एक ही फाइल के अलग-अलग बाइट काउंट होना भी संभव है?


2
क्या आप इस स्क्रिप्ट को कुछ संदर्भ दे सकते हैं जो आपको मिली?
Kusalananda

जवाबों:


13

हां, ऐसे मामले हैं।

जीएनयू के साथ लिनक्स सिस्टम पर सहानुभूति के मामले में ls, ls -lवसीयत लिंक के आकार को बाहर कर wc -cदेगी , जबकि वास्तविक फ़ाइल को हल करेगी और वहां बाइट्स की संख्या पढ़ेगी। नीचे आप देख सकते हैं कि ls -lरिपोर्ट 29 बाइट्स, जबकि wcवास्तविक फ़ाइल में 172 बाइट्स रिपोर्ट करती है।

$ 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

वर्चुअल फाइलसिस्टम के मामले में , जैसे कि/proc या/sys , वहाँ कई फाइलें आकार 0 के रूप में दिखेंगी ls -l/devफाइलसिस्टम के अंतर्गत हमारे पास विभिन्न प्रकार की विशेष फाइलें होती हैं, जैसे कि चरित्र डिवाइस और ब्लॉक डिवाइस - wc -cउन पर लटकी होती हैं और आकार के बजाय प्रमुख और मामूली संख्याls -l दिखाती हैं ।

नाम दिया गया पाइप को 0बाइट्स के रूप में रिपोर्ट किया जाएगा ls -c, लेकिन wc -cवास्तव में पाइप की सामग्री को पढ़ेंगे, इसलिए तकनीकी रूप से यह आपको बताएगा कि नामित पाइप में कितना डेटा है:

$ 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 

एक नियमित फ़ाइलों के लिए, आकार बराबर होना चाहिए।


की बात ls -lऔर wc -c, और कैसे वे भी काम अलग है। wc -cवास्तव में पढ़ने के लिए फ़ाइल खोलता है (आप देख सकते हैं कि यदि आप strace wc -c /etc/passwdउदाहरण के लिए चलाते हैं )। ls -lकेवल stat()उन पर कॉल करता है । यह भी बताता है कि /proc ls -lशो 0 आकार में क्यों - आप उन फ़ाइलों को स्टेट नहीं कर सकते क्योंकि वे "वास्तविक" नहीं हैं या वास्तव में हार्ड-ड्राइव / एसएसडी पर संग्रहीत हैं। wc -cइसके बजाय, उस फ़ाइल की सामग्री को पढ़ता है , और इसके आकार की गणना करता है।

अंत में, ls -lकेवल आइटम को अंतःक्रियात्मक रूप से सूचीबद्ध करने के लिए एक उपकरण है। पटकथा के लिए यह शायद ही अच्छा है। जब आपको वास्तव में डेटा पढ़ने की आवश्यकता होती है, तो wc -cइसके बजाय उपयोग करें ।

कृपया ध्यान दें, कि किसी फ़ाइल के स्क्रिप्टिंग और आकलन के लिए, lsसबसे अच्छा उम्मीदवार नहीं है। वास्तव में, पार्सिंग lsआउटपुट से बचने के लिए यह आम प्रथाओं में से एक है । कृपया du -b फ़ाइल के आकार का पता लगाने के लिए उपयोग करें ।


1
एक छोटा सा स्पष्टीकरण - आभासी फ़ाइलें (में /sys/, /proc/, आदि) कर सकते हैं प्रदान statकरता है, तो implementer चुनता जानकारी,। ज्यादातर समय, वहाँ एक सम्मोहक कारण नहीं है, इसलिए इसे छोड़ दिया जाता है। उदाहरणों में शामिल है, /proc/kcoreजो कि पता योग्य कर्नेल मेमोरी के आकार के रूप में बताया गया है (आमतौर पर उपलब्ध भौतिक मेमोरी से बहुत अधिक)।
टोबे स्पीट

11

ls -l फ़ाइलसिस्टम द्वारा रिपोर्ट की गई फ़ाइल का आकार लौटाएगा।

wc -c'वास्तविक' आकार निर्धारित करने के लिए फ़ाइल को पढ़ने का प्रयास करेगा। मेरी टिप्पणियों से यह पहली बार अंत की मांग करने की कोशिश करता प्रतीत होता है, और अगर यह काम नहीं करता है, तो यह पूरी फाइल को पढ़ेगा, आकार को गिनता है जैसा कि यह जाता है।

यह एक सरल विवरण है कि दोनों उपकरण क्या करते हैं, लेकिन यह परिणामों के लिए कई निहितार्थों की ओर जाता है:

lsकुछ फाइल सिस्टम के लिए गलत आउटपुट देगा। उदाहरण के लिए, वर्चुअलाइज्ड फाइलसिस्टम /procकई फाइलों के लिए शून्य के आकार की रिपोर्ट करेगा, क्योंकि ये "फाइलें" भौतिक रूप से कहीं भी संग्रहीत नहीं हैं; वे सॉफ्टवेयर द्वारा आवश्यक के रूप में उत्पन्न कर रहे हैं।

wcपढ़ने अनुमतियों के बिना फ़ाइलों के लिए सभी को एक समारोह नहीं है, जबकि होगा lsनिर्देशिका सूची ही अनुमति की आवश्यकता नहीं (तुलना ls -l /etc/shadowकरने के लिए wc -c /etc/shadow)।

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, प्रतीकात्मक लिंक के लिए व्यवहार भी अलग है। क्योंकि wcउन्हें पढ़ने की कोशिश करता है, यह उस फाइल को पढ़ता है, जिस पर सिमलिंक इंगित करता है, जबकि lsसिर्फ फाइलसिस्टम पर सवाल उठाने के कारण , यह प्रतीकात्मक लिंक को स्टोर करने के लिए उपयोग किए गए आकार की रिपोर्ट करेगा।

मुझे यकीन है कि अन्य मतभेद हैं जो मैंने अभी तक नहीं सोचा है, लेकिन मुझे लगा कि मैं इन मतभेदों के पीछे मूल कारण के रूप में एक स्पष्ट और सरल स्पष्टीकरण दूंगा।


पठन अनुमतियों का उल्लेख करने के लिए +1 और seek()strace wc -lकुछ बड़ी फ़ाइलों पर चलने के बाद ऐसा प्रतीत होता है ।
सेर्गेई कोलोडियाज़नी

मेरे उत्तर की तुलना में बहुत अधिक विवरण जोड़ने के लिए +1!
साइक्लिस 3

6

एक सामान्य फ़ाइल के लिए, ls और wc कॉल स्टेट। हालाँकि, / proc या sys की फ़ाइल के लिए, ls रिटर्न 0 है, लेकिन wc एक अलग संख्या देता है:

$ ls -l /proc/modules
-r--r--r--  1 root root 0 Jan 16 14:56 modules
                        ^ this one
$ wc -c /proc/modules
7621 modules

यह शायद यह पता लगाने का कुछ तरीका है कि क्या कोई विशेष फ़ाइल है।


2
wc -cमेरे लिए कम से कम कॉल करता है fstat, लेकिन अन्य प्रयोजनों के लिए प्रतीत होता है। यह lseekअंत तक फ़ाइल की लंबाई ढूँढता है । इस घटना में कि यह एक त्रुटि लौटाता है, यह readपूरी फ़ाइल है।
मुजेर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.