यदि फ़ाइल प्रत्यय नहीं है, तो फ़ाइल प्रकार कैसे जाने जाते हैं?


55

मुझे पता है कि फ़ाइल प्रकार कैसे जाना जाता है अगर फ़ाइलनाम प्रत्यय नहीं है जानना चाहूंगा।

उदाहरण के लिए, नाम वाली फाइल myfileबाइनरी या टेक्स्ट के साथ शुरू हो सकती है, सिस्टम को कैसे पता चलेगा कि फाइल बाइनरी है या टेक्स्ट?


3
बस एक टिप्पणी, बाकी जवाब सब कुछ कवर करते हैं। आजकल ऐसा हो सकता है कि एक गलत स्थानीय या पुराने निष्पादनयोग्य के साथ, कुछ यूटीएफ -8 फाइलें गैर-एसिसी बाइट्स के कारण द्विआधारी डेटा के रूप में गलत हो सकती हैं।
ओरियन

19
सिस्टम परवाह नहीं करता है। कुछ एप्लिकेशन देखभाल कर सकते हैं, लेकिन उनके पास इसे संभालने के अपने तरीके हैं।
jwodder

2
ध्यान दें कि यहां तक ​​कि नियमित फ़ाइलों के लिए (डिवाइस फ़ाइलें नहीं, यूनिक्स डोमेन सॉकेट, नामित पाइप आदि) "फ़ाइल प्रकार" का अर्थ दो अलग-अलग चीजें हो सकती हैं: (1) एक विशेष फ़ाइल प्रारूप (".docx", XML, MS-DOS पाठ प्रारूप। , आरटीएफ, निश्चित-लंबाई रिकॉर्ड, सूची बहुत लंबी हो सकती है) या (2) एक फ़ाइल जो एक विशेष ऐप जानता है कि कैसे (".xlsx" या ".doc" या जो भी हो, प्रारूप प्रकार के साथ ओवरलैप करना है)। । यह "फ़ाइल प्रकार" के बारे में बात करते समय उस अंतर को ध्यान में रखने लायक है।
ब्रूस एडगर

@jwodder सिस्टम देखभाल करता है। यह सिस्टम है जो शिकायत करता है कि आप उन अनुप्रयोगों को नहीं, जब आप एक गैर-निष्पादन योग्य फ़ाइल निष्पादित नहीं कर सकते हैं!
श्री लिस्टर

1
@MrLister True, लेकिन निष्पादन योग्य / गैर-निष्पादन योग्य का 'विस्तार' से कोई लेना-देना नहीं है।
user2338816

जवाबों:


84

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बस "डेटा" प्रिंट करता है।

तो, आप देखते हैं कि प्रत्यय की कोई आवश्यकता नहीं है। एक प्रत्यय वैसे भी भ्रमित कर सकता है, अगर गलत सेट हो।


4
वहाँ भी है freeedesktop.org साझा MIME डेटाबेस, जो अनिवार्य रूप से सभी X11 अनुप्रयोगों द्वारा उपयोग किया जाता है। यह अवधारणा में समान है कि क्या file(1)करता है, लेकिन एक (बहुत) अलग कार्यान्वयन के साथ।
lcd047

4
ध्यान दें कि इस प्रक्रिया का परिणाम मूल रूप से एक अनुमान है, और कुछ महत्वपूर्ण के लिए इस पर भरोसा नहीं किया जाना चाहिए। (सुविधा के साथ, फ़ाइल खोलने के लिए डिफ़ॉल्ट प्रोग्राम तय करने जैसी सुविधा, ठीक है)
user253751

इसलिए यदि मैं एक टेक्स्ट फ़ाइल के शीर्ष पर% PNG जोड़ता हूं, तो यह एक पीएनजी फ़ाइल के रूप में देखा जाएगा। सही??
गाथा

@ सागा यदि आपको एन्कोडिंग सही आती है और यदि आप प्रतिशत चिह्न के बजाय प्रति मील संकेत डालते हैं तो: हो सकता है। अतिरिक्त परीक्षण हो सकते हैं।
बनंगुइन

19

अक्सर, यह परवाह नहीं करता है। आप इसे केवल एक कार्यक्रम में पास करते हैं और या तो यह व्याख्या करता है या यह नहीं करता है। पाठ संपादक में .jpg खोलने के लिए यह उपयोगी नहीं हो सकता है, लेकिन आपको ऐसा करने से रोका नहीं जाता है। शेष फ़ाइल नाम की तरह विस्तार, मनुष्यों की संगठनात्मक सुविधा के लिए है।

ऐसी फ़ाइलों का निर्माण करना भी संभव हो सकता है जिन्हें कई तरीकों से मान्य किया जा सकता है। क्योंकि जिप फाइल फॉर्मेट में फाइल के अंत में हेडर होता है , आप अन्य चीजों को सामने रख सकते हैं और फिर भी यह जिप फाइल के रूप में लोड होगी। यह आमतौर पर सेल्फ-एक्सट्रैक्टिंग ज़िप फाइल बनाने के लिए उपयोग किया जाता है।


4
अंतिम पैराग्राफ पुन: फंकी फाइल फॉर्मेट्स उस विषय पर एक दिलचस्प बात है, उदाहरण के लिए एक जेपीईजी प्रस्तुत करना जो एक जावा हैलो वर्ल्ड प्रोग्राम भी है, एईएस एन्क्रिप्ट करने के बाद यह एक पीएनजी बन जाता है, या 3 डीईएस डिक्रिप्ट करने के बाद यह पीडीएफ और अधिक हो जाता है ( सभी "दिलचस्प" सामग्री के साथ, यानी न केवल सफेद शोर या कलाकृतियों के साथ)
हेगन वॉन एटिजन

14

वह जानकारी आमतौर पर फ़ाइल के हेडर में पाई जाती है। 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

3
यह बल्कि भ्रामक है। यूनिक्स फ़ाइलों में प्रति "हेडर" नहीं होता है। fileआदेश फ़ाइल की सामग्री को कैसे फ़ाइल शायद इस्तेमाल किया जा करने का इरादा है से लगता है की कोशिश करता है। यह अचूक नहीं है।
नैट एल्ड्रेडज

आपने जिस व्यवहार के बारे में बताया है उसमें आप सही हैं file। यह वास्तव में फ़ाइल का विश्लेषण करता है। हालाँकि, अधिकांश फ़ाइल प्रकारों को एक शीर्ष लेख द्वारा पहचाना जाता है। 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............एक ईएलएफ निष्पादन योग्य (पहले कुछ बाइट्स ऑफ / बिन / एलएस) का हेडर है। इसी प्रकार #!/bin/bashASCII फ़ाइल के शीर्ष पर इसे शेल स्क्रिप्ट के रूप में पहचाना जाएगा। एक और उदाहरण: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(.png इमेज)
h3rrmiller

2
लेकिन आपका जवाब यह ध्वनि देता है जैसे हेडर एक यूनिक्स फ़ाइल की एक अंतर्निहित विशेषता है। उदाहरण के लिए, टेक्स्ट फ़ाइलों में ऐसा कोई हेडर नहीं है; ओपी जैसा कोई व्यक्ति शायद एक सी स्रोत फ़ाइल और एक जावा स्रोत फ़ाइल को "अलग-अलग" फ़ाइल प्रकारों पर विचार करेगा, लेकिन उन्हें अलग करने के लिए कोई हेडर नहीं है। मेरा तर्क है कि "फ़ाइल प्रकार" यूनिक्स के तहत एक सार्थक अवधारणा भी नहीं है; ऑपरेटिंग सिस्टम बस एक फ़ाइल सिस्टम प्रदान करता है, और यह किसी भी फ़ाइल के मतलब की सामग्री को तय करने के लिए प्रत्येक एप्लिकेशन पर निर्भर है।
नैट एल्ड्रेडज

मैं सहमत हूँ। मैं बहुत अधिक खरगोश छेद नीचे जाने के बिना बस के रूप में संभव के रूप में जवाब देने की कोशिश कर रहा था।
hrrrmiller

7

जांच करने के लिए पहली चीज हार्ड-कोडित फ़ाइल प्रकार है जिसे कर्नेल द्वारा मान्यता प्राप्त है। ये फाइल प्रकार हैं जैसे डायरेक्टरी, कैरेक्टर-स्पेशल फाइल, ब्लॉक-स्पेशल फाइल, पाइप-स्पेशल फाइल, सॉकेट और सिंबल लिंक। यह जानकारी फ़ाइल के इनकोड से आती है। यदि फ़ाइल एक सादा फ़ाइल है, तो जानकारी का अगला सेट पैटर्न की तलाश में पहले 256 बाइट्स से आता है। इस प्रकार, टेक्स्ट फाइलें और सी सोर्स कोड उन बाइट्स की जांच करके पहचाने जाते हैं। इसके अलावा, उपयोगिताओं में एक जादू नंबर भी दिखता है जो फ़ाइल प्रकार का परीक्षण और मान्य करने के लिए उपयोग किया जाता है। आप फ़ाइल में जानकारी जोड़कर मान्यता प्राप्त होने के लिए अपने खुद के फ़ाइल प्रकार जोड़ सकते हैं /etc/magicmagic(5)मैजिक फ़ाइल के प्रारूप को देखने के लिए मैन पेज देखें।

पुराने कार्यान्वयन में (Solaris, उदाहरण के लिए), फ़ाइल /etc/magicने पहचाने गए अधिकांश फ़ाइल प्रकारों की गणना की।


4

fileआदेश (के कुछ हिस्सों) फ़ाइल का निरीक्षण और एक योग्य अनुमान करने से कुछ heuristics लागू होता है। इससे परे कुछ विशेष मामले हैं जहां अतिरिक्त जानकारी प्राप्त की जा सकती है; की तरह #!एक पाठ फ़ाइल की शुरुआत में, एक BOM (बाइट क्रम चिह्न), या निष्पादन योग्य फ़ाइल प्रारूपों के विशिष्ट हैडर बाइट्स। #!निष्पादनयोग्य में और बाइनरी अंक प्रणाली द्वारा किया जाता है उन्हें अलग से बताने।


4

सिस्टम यह नहीं जानता कि कोई फाइल बाइनरी है या टेक्स्ट। सभी (AFAIK) यूनिक्स-प्रकार के ऑपरेटिंग सिस्टम में, fopen(path, "rb")बिल्कुल वैसा ही है fopen(path "r")- जिसका bकोई प्रभाव नहीं है। इसे स्वीकार किया जाता है क्योंकि मानक C को कुछ अन्य OS के लिए पोर्टेबल होना चाहिए जो इस तरह का अंतर करते हैं।


0

मेरा तर्क है कि "फ़ाइल प्रकार" यूनिक्स के तहत एक सार्थक अवधारणा भी नहीं है;

मेनफ्रेम के अच्छे पुराने दिनों में उनके ओएस समर्थित कई फ़ाइल प्रकारों सहित अनुक्रमिक और सूचकांक-अनुक्रमिक। आधुनिक ऑपरेटिंग सिस्टम (Un * x और यकीनन विंडोज़) फ़ाइल प्रकारों के सेट को कम से कम (निष्पादन योग्य, साझा ऑब्जेक्ट सहित) को कम करता है।

ऐसी फ़ाइलों का निर्माण करना भी संभव हो सकता है, जिन्हें कई तरीकों से मान्य किया जा सकता है

यह संभव है, एक मुश्किल फ़ाइल प्रारूप है: सी कोड का एक टुकड़ा जिसे एक छवि विवरण के रूप में व्याख्या किया जा सकता है। इसके अलावा विभिन्न प्रारूप कम और अधिक विशिष्ट हैं: पाठ फ़ाइल, एक्सएमएल फ़ाइल, एक एसओएपी दस्तावेज़।


1
फ़ाइल स्वरूपों के रूप में, XPM वह मुश्किल नहीं है। मैं "ट्रिकी" पर विचार करना शुरू करता हूं जो कि एक मान्य जेपीईजी और एक वैध ज़िप फ़ाइल दोनों है।
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.