Dosyaları sınıflandırmak için Linux dosya komutu


17

Rasgele dosyalarda bulunan veri türünü tanımam gerekiyor. Linux'ta yeniyim.

fileBir dosyanın ne tür veri olduğunu anlamak için komutu kullanmayı planlıyorum . Bu komutu denedim ve çıktıyı aşağıda aldım.

Birisi bana filekomutun veri türünü belirlemek için bir dosyanın ilk baytlarına bakmasını önerdi . fileKomut hiç bir dosya uzantısı bakmaz. Bu doğru mu? Adam sayfasına baktım ama çok teknik olduğunu hissettim. Herkes filekomutun nasıl çalıştığı hakkında çok daha basit bir açıklamaya sahip bir bağlantı sağlayabilir eğer takdir ediyorum .

fileKomutu çalıştırdıktan sonra alabileceğim farklı olası cevaplar nelerdir ? Örneğin, aşağıdaki transkriptte JPEG, ISO medyası, ASCII, vb.

Ekran çıkışı aşağıdaki gibidir

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Güncelleme 1

Cevaplarınız için teşekkürler ve benim için birkaç şeyi açıkladılar.

Eğer doğru anlıyorsam klasör / usr / share / mime / magic bana mevcut olası dosya formatlarını (dosya komutunu yazıp bir dosya ile takip ettiğimde alabileceğim çıktılar) ne olduğunu verecek bir veritabanına sahip. bu doğru mu? 'Dosya' komut çıktısı "metin" kelimesini içerdiğinde, metin görüntüleyici ile okuyabileceğiniz bir şeyi ifade ettiği ve "metin" içermeyen herhangi bir şeyin bir tür ikili olduğu doğru mudur?


6
Gelecekte, terminal çıkışının bir resmini yayınlamak gerçekten tavsiye edilmez (veya kimse tarafından beğenilmez). Markdown kod bloğu formatını kullanın.
HalosGhost

3
Resmi kaldırdım ve kodu gönderdim.
user2543622

Not: Dosya bir dosyayı tanımlayamazsa, TrID genellikle bunu yapabilir. kullanarak topluluk tarafından oluşturulan kendi dosya özellikleri veritabanına sahiptir.
Josef, Reinstate Monica'ya

Yanıtlar:


13

file birkaç çeşit test kullanır :

1: Dosya yoksa, okunamıyorsa veya dosya durumu belirlenememişse, çıktı dosyanın işlendiğini, ancak türünün belirlenemediğini göstermelidir.

Bu çıktı gibi olacak cannot open file: No such file or directory.

2: Dosya normal bir dosya değilse, dosya türü tanımlanacaktır. Dosya türleri dizini, FIFO, soket, özel blok ve özel karakter bu şekilde tanımlanmalıdır. Uygulama tarafından tanımlanan diğer dosya türleri de tanımlanabilir. Dosya sembolik bir bağlantıysa, varsayılan olarak bağlantı çözümlenecek ve dosya sembolik bağlantı tarafından başvurulan dosya türünü test edecektir. ( Aşağıdaki -hve -iseçeneklerine bakın.)

Bu .: directoryve /dev/sda: block special. Bu ve önceki nokta için formatın çoğu POSIX tarafından kısmen tanımlanmıştır - çıktıdaki belirli dizelere güvenebilirsiniz.

3: Dosyanın uzunluğu sıfırsa, boş bir dosya olarak tanımlanmalıdır.

Bu foo: empty.

4: Dosya yardımcı programı dosyanın ilk segmentini inceleyecek ve içeriğini konuma duyarlı testlere dayanarak belirleyecek bir tahminde bulunacaktır. (Yanıtın doğru olduğu garanti edilmez; aşağıdaki -d, -M ve -m seçeneklerine bakın.)

5: Dosya yardımcı programı dosyayı inceler ve içeriğe duyarlı varsayılan sistem testlerine dayanarak içeriğini tanımlamayı tahmin eder. (Yanıtın doğru olduğu garanti edilmez.)

Bu ikisi sihirli sayı tanımlaması kullanır ve komutun en ilginç kısmıdır. Bir sihirli sayı tanımlar türünün bir dosyada bilinen bir yerde bulunuyor bayt özel dizisidir. Geleneksel olarak bu yer ilk iki bayttır, ancak terim daha uzun dizeleri ve diğer konumları içerecek şekilde genişletilmiştir. Komuttaki sihirli sayılar hakkında daha fazla ayrıntı için bu diğer soruya bakın file.

fileKomut bu sayıların bir veritabanına sahip ve ne karşılık tip; Bu veritabanı genellikle içeridedir/usr/share/mime/magic ve dosya içeriğini MIME türleriyle eşler . Oradaki çıktı (genellikle file -ivarsayılan olarak alamıyorsanız , bir kısmı ) tanımlanmış bir medya türü veya bir uzantı olacaktır. "Bağlama duyarlı testler" aynı tür yaklaşımı kullanır, ancak biraz daha bulanıktır. Bunların hiçbirinin doğru olduğu garanti edilmez, ancak iyi tahminler yapılması amaçlanmıştır.

fileAyrıca, bu türleri adlarıyla eşleştiren bir veritabanına sahiptir ve bu dosya tarafından tanımlandığı bir dosyanın application/pdfbir PDF document. Bu okunabilir adlar başka bir dile de yerelleştirilebilir. Bunlar her zaman dosya türünün bir makine yerine bir kişinin anlayacağı şekilde yüksek düzeyli bir açıklaması olacaktır.

Alabileceğiniz farklı çıktıların çoğu bu aşamalardan gelecektir. magicDesteklenen türlerin bir listesini ve nasıl tanımlandığını görmek için dosyaya bakabilirsiniz - sistemim 376 farklı türü biliyor. Verilen adlar ve desteklenen türler sistem ambalajınız ve yapılandırmanız tarafından belirlenir ve böylece sisteminiz benimkinden daha fazla veya daha azını destekleyebilir, ancak genellikle birçoğu vardır. libmagicayrıca ek sabit kodlu testler de içerir.

6: Dosya bir veri dosyası olarak tanımlanacaktır.

Bu, foo: datadosya hakkında hiçbir şey bulamadığında.

Görünebilecek başka küçük etiketler de vardır. Bir yürütülebilir ( +x) dosya executableçıktıda genellikle virgülle ayrılmış " " içerir . fileUygulama ayrıca "örneğinde olduğu gibi, onlar hakkında ek puan tarif edebilmek için bazı dosya biçimleri hakkında ekstra şeyler biliyor olabilir PDF document, version 1.4".


8

Man sayfaları giriş değil, genellikle kısa referanslardır. Wikipedia sayfasından başlayın .

filedosya adına değil yalnızca dosya içeriğine bakar. (Ayrıca dosya türü gibi bazı dosya meta verilerine de bakar: dizin, sembolik bağlantı, adlandırılmış kanal vb. Ancak ilgilendiğiniz durumlarda önemli olan içerik budur.)

filegenellikle bir dosyanın biçimini ilk birkaç bayta bakarak ve yerleşik bir sihirli sayı tablosu ile karşılaştırarak tahmin eder . Örneğin, dosya ile başlıyorsa %PDF, file“PDF belgesi” rapor eder (ve minimum sürümü rapor etmek için daha fazla araştırma yapar). Sihirli sayılarla başlamayan dosya türleri için sezgisel tarama içerir, örneğin ilk birkaç baytın tamamı yazdırılabilir ASCII aralığındaysa “ASCII metni” raporlayın.

Çıktısı filekırılgandır: unix varyantından unix varyantına ve versiyondan versiyona değişebilir. Linux, Cygwin ve * BSD'de filekomut, MIME ortam türü-i biçiminde öngörülebilir çıktı üreten bir seçeneği destekler (IANA , standart ortam türleri listesini yönetir ). Çok fazla ayrıntı yok ve çıktı daha az insan dostu, ancak çıktı öngörülebilir ve bilgisayar dostu.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Kullanım file --mime-typeYalnızca MIME gibi bilgileri kodlayan olmadan kendini yazın isterseniz application/pdf. -bSatırın başında dosya adını görüntülemek istemiyorsanız seçeneği iletin.


5

Cevabı buradan okumanı istiyorum . Cevaptan bazı alıntılar,

fileKomutun man sayfasından ,

file komutu aslında dosya türünü belirlemek için 3 test gerçekleştirir.

İlk test

Dosya sistemi testleri, bir stat (2) sistem çağrısından geri dönüşün incelenmesine dayanır.

İkinci test

Sihirli sayı testleri, belirli sabit biçimlerde veri içeren dosyaları kontrol etmek için kullanılır.

Üçüncü test

Dil testleri, bir dosyanın ilk birkaç bloğunda herhangi bir yerde görünebilen belirli dizeleri (cf names.h) arar. Örneğin, .br anahtar sözcüğü, dosyanın büyük olasılıkla bir troff (1) giriş dosyası olduğunu, tıpkı anahtar kelime yapısı bir C programını belirttiği gibi olduğunu gösterir.

fileKomutun çıktısı genellikle başarılı olan herhangi bir testin sonucuna dayanır.

Şimdi, C ++ programının böyle başladığını ve üçüncü testin başarılı olduğunu varsayarsak,

#include <iostream.h>
bla
bla

Üçüncü teste göre, anahtar kelime elimizde bir CPP programımız olmasına rağmen #includeözellikle C tipi program olduğunu belirtir . Şimdi kontrol ettiğimde,

$ file example.cpp

example.cpp: ASCII C program text

Şimdi, nesne yönelimli kavramlar C ++ 'a özgüdür. C ++ ' a özgü bir dosya oluşturalım .

C ++ programımı şu şekilde başlatıyorum:

Class something
{
}
bla
bla

Şimdi, yayınladığımda

$ file example.cpp

Çıktı,

example.cpp: ASCII C++ program text

Bu temelde filekomutun benzer dosyalar üzerinde nasıl çalıştığını açıklar (Bu örnekte, C programına ve C ++ programına, C ++ 'a özgü nesne yönelimli özellikler kullanılmadıkça ve kullanılmadıkça aynı şekilde davranılır).


1

Gilles ve Michael Homer mükemmel cevaplar verdiler. ki ben sana atıfta bulunuyorum. Sisteminizde tanınan dosya türlerini görmek için çalıştırmayı deneyin

cat /usr/share/magic

Bu izin sorunları veriyorsa veya mevcut değilse, muhtemelen

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(sisteminize bağlı olarak ince ayar yapmanız gerekebilir), bu da sisteminizdeki dosya türlerinin bir listesini göstermelidir. Bu komutun kök dosya sisteminizin boyutuna bağlı olarak çalışması uzun sürebilir.

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.