Dosya sonekinden değilse, dosya tipleri nasıl bilinir?


55

Dosya adlarında sonek yoksa, dosya türlerinin nasıl bilindiğini bilmek istiyorum.

Örneğin, adlandırılmış bir dosya myfileikili veya başlangıçta metin olabilir; dosyanın ikili veya metin olduğunu sistem nasıl anlar?


3
Sadece bir yorum, cevapların geri kalanı her şeyi kapsar. Günümüzde, yanlış yapılandırılmış bir yerel ayar veya eski çalıştırılabilir dosyalarla, bazı utf-8 dosyalarının, ascii olmayan baytlar nedeniyle ikili veri olarak yanlış algılanması olabilir.
orion

19
Sistem umrunda değil. Bazı uygulamalar önemseyebilir, ancak her birinin bunu gerçekleştirmenin kendi yolları vardır.
jwodder

2
Düzenli dosyalar için bile (aygıt dosyaları değil, unix alan soketleri, adlandırılmış yöneltmeler vb.) "Dosya türü" iki farklı anlama gelebilir: (1) Belirli bir dosya biçimi (".docx", XML, MS-DOS metin biçimi) , RTF, sabit uzunlukta kayıtlar, liste çok uzun olabilir) veya (2) Belirli bir uygulamanın nasıl başa çıkacağını bildiği bir dosya (".xlsx" veya ".doc" ya da her neyse, format türüyle çakışıyor) . "Dosya türü" hakkında konuşurken bu ayrımı aklınızda tutmaya değer.
Bruce Ediger

@jwodder Sistem önemser. Bu uygulamaları değil, denediğinizde çalıştırılabilir olmayan bir dosyayı çalıştıramayacağınızdan şikayetçi olan sistem!
Bay Lister,

1
@ MrLister True, ancak çalıştırılabilir / çalıştırılabilir olmayan 'uzantı' ile ilgisi yok.
user2338816

Yanıtlar:


84

Yardımcı fileprogram, dosya türünü 3 yoldan belirler:

Öncelikle dosya sistemi testleri : Bu testlerde, stat ailesi sistem çağrılarından biri dosyaya çağrılır. Bu, farklı unix dosya tiplerini döndürür : normal dosya, dizin, link, karakter cihazı, blok cihazı, adlandırılmış yöneltme veya soket. Buna bağlı olarak, sihirli testler yapılır.

Sihirli testler biraz daha karmaşıktır. Dosya türleri, sihirli dosya adı verilen bir desen veritabanı tarafından tahmin edilir . Bazı dosya türleri, dosya içindeki belirli bir yerde bir bit veya sayı okuyarak belirlenebilir (örneğin ikili dosyalar). Sihirli dosya , dosyayı içerip içermediğini ve hangi metin bilgilerinin yazdırılması gerektiğini sınamak için " sihirli sayılar " içerir. Bu " sihirli sayılar " 1-4Byte değerleri, karakterleri, tarihleri ​​ve hatta normal ifadeler olabilir. Daha fazla test ile ek bilgi bulunabilir. Bir yürütülebilir durumunda, ek bilgiler olmasından bağımsız olacağını dinamik bağlantılı ya da değil, elimdenveya değil veya mimarlık. Bazen, dosya türü gerçekten tanımlanmadan önce birden fazla test geçmelidir. Ama yine de, kaç test yapıldığının önemi yok, her zaman sadece iyi bir tahmin .

İşte bu sihirli sayıların nasıl göründüğü hakkında bir fikir edinmemize yardımcı olabilecek bazı ortak dosya dosyalarının ilk 8 baytı:

             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

Dosya türü sihirli testler üzerinde bulunamazsa, dosya bir metin dosyası gibi filegörünür ve içeriğin kodlanmasına bakar. Kodlama, her sette yazdırılabilir metin oluşturan farklı aralık ve bayt dizileri ile ayırt edilir.

Satır sonları, HEX değerlerine bağlı olarak da incelenir:

  • 0A( \n) Un * x / Linux / BSD / OSX sonlandırılmış bir dosyayı sınıflandırır
  • 0D 0A( \r\n) Microsoft işletim sistemlerinden gelen dosyalardır.
  • 0D( \r) sürüm 9'a kadar Mac OS olur
  • 15( \025) IBM’in AIX’i olurdu

Şimdi dil testleri başlıyor. Bir metin dosyası gibi görünüyorsa, hangi dili içerdiğini bulmak için dosya belirli dizgilerde aranır (C, Perl, Bash). Bazı komut dosyası dilleri, komut dosyasının ilk satırındaki hashbang ( #!/bin/interpreter) üzerinden de tanımlanabilir .

Dosyaya hiçbir şey uygulanmazsa, dosya türü belirlenemez ve fileyalnızca "veri" yi yazdırır.

Yani, bir son eke gerek olmadığını görüyorsunuz. Yine de bir son ek, yanlış yapılırsa karışabilir.


4
Ayrıca, tüm X11 uygulamaları tarafından kullanılan freedesktop.org paylaşımlı MIME veritabanı da var. Bu, konsepte ne yaptığına benzer file(1), ancak (çok) farklı bir uygulama ile.
lcd047

4
Bu sürecin sonucunun temelde bir tahmin olduğunu ve önemli bir şey için güvenilmemesi gerektiğini unutmayın. (Dosyanın açılması için varsayılan programa karar vermek gibi kolaylık özellikleri iyidir)
user253751 0

Yani bir metin dosyasının başına% PNG eklersem, bu bir png dosyası olarak görülür. Sağ??
destan

@saga Kodlamayı doğru yaparsanız ve yüzde işareti yerine bir mille işareti koyarsanız o zaman: belki. Ek testler olabilir.
Bananguin

19

Genellikle, umursamıyor. Sadece bir programa aktarın ve ya yorumluyor ya da vermiyor. Bir .jpg dosyasını bir metin düzenleyicide açmak faydalı olmayabilir, ancak bunu yapmanız engellenmez. Bu dosya adının geri kalanı gibi uzantı da insanların örgütsel rahatlığı içindir.

Geçerli olarak çeşitli şekillerde yorumlanabilecek dosyalar oluşturmak da mümkün olabilir. ZIP dosya biçimi başladığında dosyanın sonunda bir başlık olduğundan, öne doğru başka şeyler hazırlayabilirsiniz ve yine de ZIP dosyası olarak yüklenir. Bu genellikle kendiliğinden açılan zip dosyalarını oluşturmak için kullanılır.


4
Son paragrafta: Funky File Formats , bu konuda ilginç bir konuşmadır; örneğin, bir java hello dünya programı olan bir jpeg, AES şifrelemesinden sonra bir PNG olur veya 3DES şifresini çözdükten sonra PDF ve daha fazlası olur ( hepsi "ilginç" içerikli, yani sadece beyaz gürültü veya eserler ile)
Hagen von Eitzen

14

Bu bilgi genellikle dosyanın başlığında bulunur. fileKomut hedef analizleri ve dosya hakkında size bilgi verir. Çok fazla bilgi, genellikle bir dosyanın ilk birkaç baytının katı olan dosya başlıklarından elde edilir (aşağıya bakın). Üstbilgiler, sistem tarafından dosyaların nasıl işleneceğini bulmak için kullanılır. #!/bin/bashBir dosyanın başında, sisteme aşağıdaki betiği yorumlamak için bash kabuğunu kullanması söylenir. ELFsisteme bunun bir ELF çalıştırılabilir olduğunu söyler.

[~] 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

Dosya başlığı örnekleri:

[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
Bu oldukça yanıltıcıdır. Unix dosyalarında kendi başına bir "başlık" yoktur. fileKomut dosyası muhtemelen kullanılmak üzere tasarlanmıştır nasıl dosyanın içeriğinden tahmin etmeye çalışır. Yanılmaz değil.
Nate Eldredge

Davranışlarını nasıl açıkladığın konusunda haklısın file. Aslında dosyanın bir analizini yapar. Ancak, çoğu dosya türü bir tür başlık ile tanımlanır. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............bir ELF çalıştırılabilir başlığı (ilk / byte / bin / bys). Benzer şekilde #!/bin/bashbir ASCII dosyasının en üstünde bir kabuk betiği olarak tanımlanır. Başka bir örnek: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(a. Png görüntüsü)
h3rrmiller

2
Ancak cevabınız bir başlık gibi görünmesini sağlar, bir Unix dosyasının doğasında var olan bir özelliktir. Örneğin, metin dosyalarının böyle bir başlığı yoktur; OP gibi birileri muhtemelen bir C kaynak dosyasını ve bir Java kaynak dosyasını farklı "dosya türlerine" sahip olacak gibi göz önünde bulundurur, ancak bunları ayırt edecek bir başlık yoktur. Unix'in altında "dosya tipi" nin bile anlamlı bir kavram olmadığını savunuyorum; işletim sistemi sadece bir dosya sistemi sağlar ve verilen herhangi bir dosyanın içeriğinin ne anlama geldiğine karar vermek her uygulamaya bağlıdır.
Nate Eldredge

Katılıyorum. Çok fazla tavşan deliğinden aşağıya inmeden mümkün olduğunca basit cevap vermeye çalışıyordum.
h3rrmiller

7

Kontrol edilecek ilk şey, çekirdek tarafından tanınan sabit kodlanmış dosya türüdür. Bunlar dizin, karaktere özel dosya, bloklara özel dosya, boruya özel dosya, soket ve sembolik link gibi dosya türleridir. Bu bilgi, dosya düğmesinden gelir. Dosya düz bir dosya ise, bir sonraki bilgi kümesi, kalıpları arayarak ilk 256 bayttan gelir. Böylece, metin dosyaları ve C kaynak kodu bu baytları inceleyerek tanınır. Ek olarak, yardımcı programlar ayrıca dosya türünü test etmek ve doğrulamak için kullanılan sihirli bir sayı arar . Bilgileri dosyaya ekleyerek tanınacak kendi dosya türlerinizi ekleyebilirsiniz /etc/magic. magic(5)Sihirli dosyanın biçimini görmek için man sayfasına bakın.

Daha eski uygulamalarda (örneğin Solaris), /etc/magicdosya tanınan dosya türlerinin çoğunu numaralandırdı.


4

Bu filekomut, bazı sezgisel bilgileri dosyanın incelemesinden (bölümlerinden) ve nitelikli bir tahminde bulunmadan uygular. Bunun dışında, ek bilgi edinebileceğiniz bazı özel durumlar vardır; #!Bir metin dosyasının başlangıcındaki gibi , bir BoM (bayt sipariş işareti) veya çalıştırılabilir dosya formatlarının belirli başlık baytları gibi. #!Yürütülebilir ve ikili işaretleri ayırt etmek sistem tarafından kullanılır.


4

Sistem bir dosyanın ikili mi yoksa metin mi olduğunu bilmiyor. Tümünde (AFAIK) Unix tipi işletim sistemleri, fopen(path, "rb")tamamen aynıdır fopen(path "r")- betkisi yoktur. Standart C'nin böyle bir ayrım yapan diğer işletim sistemlerine taşınabilir olması gerektiğinden kabul edildi.


0

Unix'in altında "dosya tipi" nin bile anlamlı bir kavram olmadığını savunuyorum;

Ana bilgisayarların eski güzel günlerinde, işletim sistemleri sıralı ve dizin sıralı gibi çeşitli dosya türlerini destekledi. Modern işletim sistemleri (Un * x ve tartışmalı Windows) dosya türlerini en aza indirir (çalıştırılabilir, paylaşılan nesne dahil).

Geçerli olarak çeşitli şekillerde yorumlanabilecek dosyalar oluşturmak da mümkün olabilir

Mümkün, zor bir dosya formatı var: bir resim açıklaması olarak yorumlanabilen bir C kodu parçası. Ayrıca daha az ve daha belirgin farklı biçimler var: metin dosyası, XML dosyası, bir SOAP belgesi.


1
Dosya biçimleri artarken, XPM o kadar da zor değildir. Geçerli bir JPEG ve geçerli bir ZIP dosyası olan bir şeyle başlamak için "zor" olduğunu düşünüyorum.
Mark
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.