Dosya adlarında sonek yoksa, dosya türlerinin nasıl bilindiğini bilmek istiyorum.
Örneğin, adlandırılmış bir dosya myfile
ikili veya başlangıçta metin olabilir; dosyanın ikili veya metin olduğunu sistem nasıl anlar?
Dosya adlarında sonek yoksa, dosya türlerinin nasıl bilindiğini bilmek istiyorum.
Örneğin, adlandırılmış bir dosya myfile
ikili veya başlangıçta metin olabilir; dosyanın ikili veya metin olduğunu sistem nasıl anlar?
Yanıtlar:
Yardımcı file
program, 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 file
gö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ır0D 0A
( \r\n
) Microsoft işletim sistemlerinden gelen dosyalardır.0D
( \r
) sürüm 9'a kadar Mac OS olur15
( \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 file
yalnı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.
file(1)
, ancak (çok) farklı bir uygulama ile.
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.
Bu bilgi genellikle dosyanın başlığında bulunur. file
Komut 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/bash
Bir dosyanın başında, sisteme aşağıdaki betiği yorumlamak için bash kabuğunu kullanması söylenir. ELF
sisteme 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
file
Komut dosyası muhtemelen kullanılmak üzere tasarlanmıştır nasıl dosyanın içeriğinden tahmin etmeye çalışır. Yanılmaz değil.
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/bash
bir 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ü)
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/magic
dosya tanınan dosya türlerinin çoğunu numaralandırdı.
Bu file
komut, 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.
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")
- b
etkisi yoktur. Standart C'nin böyle bir ayrım yapan diğer işletim sistemlerine taşınabilir olması gerektiğinden kabul edildi.
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.