मुझे पता है कि फ़ाइल प्रकार कैसे जाना जाता है अगर फ़ाइलनाम प्रत्यय नहीं है जानना चाहूंगा।
उदाहरण के लिए, नाम वाली फाइल myfile
बाइनरी या टेक्स्ट के साथ शुरू हो सकती है, सिस्टम को कैसे पता चलेगा कि फाइल बाइनरी है या टेक्स्ट?
मुझे पता है कि फ़ाइल प्रकार कैसे जाना जाता है अगर फ़ाइलनाम प्रत्यय नहीं है जानना चाहूंगा।
उदाहरण के लिए, नाम वाली फाइल myfile
बाइनरी या टेक्स्ट के साथ शुरू हो सकती है, सिस्टम को कैसे पता चलेगा कि फाइल बाइनरी है या टेक्स्ट?
जवाबों:
file
उपयोगिता 3 तरीके से अधिक फ़ाइल प्रकार निर्धारित करता है:
पहले फाइलसिस्टम परीक्षण : उन परीक्षणों के भीतर एक स्टेट परिवार प्रणाली कॉल का फाइल पर आह्वान किया जाता है। यह विभिन्न यूनिक्स फ़ाइल प्रकारों को लौटाता है : नियमित फ़ाइल, निर्देशिका, लिंक, वर्ण डिवाइस, ब्लॉक डिवाइस, जिसका नाम पाइप या सॉकेट है। उसके आधार पर, जादू परीक्षण किए जाते हैं।
जादू परीक्षण में थोड़ा और अधिक जटिल हैं। फ़ाइल प्रकारों को जादू फ़ाइल नामक पैटर्न के डेटाबेस द्वारा अनुमान लगाया जाता है । कुछ फ़ाइल प्रकारों को फ़ाइल के भीतर किसी विशेष स्थान पर बिट या संख्या को पढ़कर निर्धारित किया जा सकता है (उदाहरण के लिए बायनेरिज़)। जादू फ़ाइल में फ़ाइल का परीक्षण करने के लिए " मैजिक नंबर " होते हैं चाहे उसमें उन्हें शामिल किया जाए या नहीं और कौन सी पाठ जानकारी मुद्रित होनी चाहिए। वे " मैजिक नंबर " 1-4 बाइट मान, स्ट्रिंग्स, दिनांक या यहां तक कि नियमित अभिव्यक्ति हो सकते हैं। आगे के परीक्षणों से अतिरिक्त जानकारी मिल सकती है। एक निष्पादन योग्य के मामले में, अतिरिक्त जानकारी यह होगी कि यह गतिशील रूप से जुड़ा हुआ है या नहीं, छीन लिया गया हैया नहीं या वास्तुकला। कभी-कभी फ़ाइल प्रकार को सही पहचानने से पहले कई परीक्षणों को पास करना होगा। लेकिन वैसे भी, यह कोई फर्क नहीं पड़ता कि कितने परीक्षण किए जाते हैं, यह हमेशा एक अच्छा अनुमान है ।
यहाँ कुछ सामान्य फ़ाइल के फ़ाइल में पहले 8 बाइट्स दिए गए हैं जो हमें यह महसूस करवाने में मदद कर सकते हैं कि ये मैजिक नंबर क्या दिख सकते हैं:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
यदि फ़ाइल प्रकार जादू परीक्षणों पर नहीं पाया जा सकता है, तो फ़ाइल एक पाठ फ़ाइल file
लगती है और सामग्री के एन्कोडिंग के लिए दिखती है। एन्कोडिंग अलग-अलग रेंज और बाइट्स के अनुक्रम से अलग होती है जो प्रत्येक सेट में प्रिंट करने योग्य पाठ का गठन करते हैं।
लाइन ब्रेक की जांच उनके HEX मूल्यों के आधार पर भी की जाती है:
0A
( \n
) एक Un * x / Linux / BSD / OSX टर्मिनेटेड फाइल को वर्गीकृत करता है0D 0A
( \r\n
) Microsoft ऑपरेटिंग सिस्टम से फाइल हैं0D
( \r
) संस्करण 9 तक मैक ओएस होगा15
( \025
) IBMs AIX होगाअब भाषा परीक्षण शुरू होते हैं। यदि यह एक पाठ फ़ाइल प्रतीत होती है, तो फ़ाइल को विशेष स्ट्रिंग्स के लिए खोजा जाता है ताकि यह पता लगाया जा सके कि इसमें कौन सी भाषा है (सी, पर्ल, बैश)। स्क्रिप्ट की पहली पंक्ति में हैशबंग ( #!/bin/interpreter
) के ऊपर कुछ स्क्रिप्ट भाषाओं को भी पहचाना जा सकता है ।
यदि फ़ाइल पर कुछ भी लागू नहीं होता है, तो फ़ाइल प्रकार निर्धारित नहीं किया जा सकता है और file
बस "डेटा" प्रिंट करता है।
तो, आप देखते हैं कि प्रत्यय की कोई आवश्यकता नहीं है। एक प्रत्यय वैसे भी भ्रमित कर सकता है, अगर गलत सेट हो।
file(1)
करता है, लेकिन एक (बहुत) अलग कार्यान्वयन के साथ।
अक्सर, यह परवाह नहीं करता है। आप इसे केवल एक कार्यक्रम में पास करते हैं और या तो यह व्याख्या करता है या यह नहीं करता है। पाठ संपादक में .jpg खोलने के लिए यह उपयोगी नहीं हो सकता है, लेकिन आपको ऐसा करने से रोका नहीं जाता है। शेष फ़ाइल नाम की तरह विस्तार, मनुष्यों की संगठनात्मक सुविधा के लिए है।
ऐसी फ़ाइलों का निर्माण करना भी संभव हो सकता है जिन्हें कई तरीकों से मान्य किया जा सकता है। क्योंकि जिप फाइल फॉर्मेट में फाइल के अंत में हेडर होता है , आप अन्य चीजों को सामने रख सकते हैं और फिर भी यह जिप फाइल के रूप में लोड होगी। यह आमतौर पर सेल्फ-एक्सट्रैक्टिंग ज़िप फाइल बनाने के लिए उपयोग किया जाता है।
वह जानकारी आमतौर पर फ़ाइल के हेडर में पाई जाती है। file
आदेश लक्ष्य विश्लेषण करती है और फ़ाइल के बारे में जानकारी बताता है। बहुत सारी जानकारी अक्सर फ़ाइल हेडर से प्राप्त होती है जो अक्सर फ़ाइल के पहले कुछ बाइट्स से नीचे होती हैं (नीचे देखें)। हेडर्स का उपयोग सिस्टम द्वारा यह पता लगाने के लिए किया जाता है कि फ़ाइलों को कैसे संभालना है। #!/bin/bash
एक फ़ाइल की शुरुआत में सिस्टम को निम्नलिखित स्क्रिप्ट की व्याख्या करने के लिए बैश शेल का उपयोग करने के लिए कहता है। ELF
सिस्टम को बताता है कि यह एक ईएलएफ निष्पादन योग्य है।
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
फ़ाइल हेडर उदाहरण:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
file
आदेश फ़ाइल की सामग्री को कैसे फ़ाइल शायद इस्तेमाल किया जा करने का इरादा है से लगता है की कोशिश करता है। यह अचूक नहीं है।
file
। यह वास्तव में फ़ाइल का विश्लेषण करता है। हालाँकि, अधिकांश फ़ाइल प्रकारों को एक शीर्ष लेख द्वारा पहचाना जाता है। 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
एक ईएलएफ निष्पादन योग्य (पहले कुछ बाइट्स ऑफ / बिन / एलएस) का हेडर है। इसी प्रकार #!/bin/bash
ASCII फ़ाइल के शीर्ष पर इसे शेल स्क्रिप्ट के रूप में पहचाना जाएगा। एक और उदाहरण: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(.png इमेज)
जांच करने के लिए पहली चीज हार्ड-कोडित फ़ाइल प्रकार है जिसे कर्नेल द्वारा मान्यता प्राप्त है। ये फाइल प्रकार हैं जैसे डायरेक्टरी, कैरेक्टर-स्पेशल फाइल, ब्लॉक-स्पेशल फाइल, पाइप-स्पेशल फाइल, सॉकेट और सिंबल लिंक। यह जानकारी फ़ाइल के इनकोड से आती है। यदि फ़ाइल एक सादा फ़ाइल है, तो जानकारी का अगला सेट पैटर्न की तलाश में पहले 256 बाइट्स से आता है। इस प्रकार, टेक्स्ट फाइलें और सी सोर्स कोड उन बाइट्स की जांच करके पहचाने जाते हैं। इसके अलावा, उपयोगिताओं में एक जादू नंबर भी दिखता है जो फ़ाइल प्रकार का परीक्षण और मान्य करने के लिए उपयोग किया जाता है। आप फ़ाइल में जानकारी जोड़कर मान्यता प्राप्त होने के लिए अपने खुद के फ़ाइल प्रकार जोड़ सकते हैं /etc/magic
। magic(5)
मैजिक फ़ाइल के प्रारूप को देखने के लिए मैन पेज देखें।
पुराने कार्यान्वयन में (Solaris, उदाहरण के लिए), फ़ाइल /etc/magic
ने पहचाने गए अधिकांश फ़ाइल प्रकारों की गणना की।
file
आदेश (के कुछ हिस्सों) फ़ाइल का निरीक्षण और एक योग्य अनुमान करने से कुछ heuristics लागू होता है। इससे परे कुछ विशेष मामले हैं जहां अतिरिक्त जानकारी प्राप्त की जा सकती है; की तरह #!
एक पाठ फ़ाइल की शुरुआत में, एक BOM (बाइट क्रम चिह्न), या निष्पादन योग्य फ़ाइल प्रारूपों के विशिष्ट हैडर बाइट्स। #!
निष्पादनयोग्य में और बाइनरी अंक प्रणाली द्वारा किया जाता है उन्हें अलग से बताने।
सिस्टम यह नहीं जानता कि कोई फाइल बाइनरी है या टेक्स्ट। सभी (AFAIK) यूनिक्स-प्रकार के ऑपरेटिंग सिस्टम में, fopen(path, "rb")
बिल्कुल वैसा ही है fopen(path "r")
- जिसका b
कोई प्रभाव नहीं है। इसे स्वीकार किया जाता है क्योंकि मानक C को कुछ अन्य OS के लिए पोर्टेबल होना चाहिए जो इस तरह का अंतर करते हैं।
मेरा तर्क है कि "फ़ाइल प्रकार" यूनिक्स के तहत एक सार्थक अवधारणा भी नहीं है;
मेनफ्रेम के अच्छे पुराने दिनों में उनके ओएस समर्थित कई फ़ाइल प्रकारों सहित अनुक्रमिक और सूचकांक-अनुक्रमिक। आधुनिक ऑपरेटिंग सिस्टम (Un * x और यकीनन विंडोज़) फ़ाइल प्रकारों के सेट को कम से कम (निष्पादन योग्य, साझा ऑब्जेक्ट सहित) को कम करता है।
ऐसी फ़ाइलों का निर्माण करना भी संभव हो सकता है, जिन्हें कई तरीकों से मान्य किया जा सकता है
यह संभव है, एक मुश्किल फ़ाइल प्रारूप है: सी कोड का एक टुकड़ा जिसे एक छवि विवरण के रूप में व्याख्या किया जा सकता है। इसके अलावा विभिन्न प्रारूप कम और अधिक विशिष्ट हैं: पाठ फ़ाइल, एक्सएमएल फ़ाइल, एक एसओएपी दस्तावेज़।