Perintah file Linux mengklasifikasikan file

17

Saya perlu mengenali tipe data yang terkandung dalam file acak. Saya baru mengenal Linux.

Saya berencana untuk menggunakan fileperintah untuk memahami jenis data apa yang dimiliki suatu file. Saya mencoba perintah itu dan mendapatkan output di bawah ini.

Seseorang menyarankan kepada saya bahwa fileperintah melihat byte awal file untuk menentukan tipe data. The fileperintah tidak melihat ekstensi file sama sekali. Apakah itu benar? Saya melihat halaman manual tetapi merasa itu terlalu teknis. Saya akan sangat menghargai jika ada yang bisa memberikan tautan yang memiliki penjelasan lebih sederhana tentang bagaimana fileperintah itu bekerja.

Apa kemungkinan jawaban berbeda yang bisa saya dapatkan setelah menjalankan fileperintah? Misalnya, dalam transkrip di bawah ini saya mendapatkan JPEG, media ISO, ASCII, dll:

Output layar adalah sebagai berikut

 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


Perbarui 1

Terima kasih atas jawaban dan mereka mengklarifikasi beberapa hal untuk saya.

Jadi jika saya mengerti benar folder / usr / share / mime / magic memiliki database yang akan memberi saya apa format file saat ini (output yang bisa saya dapatkan ketika saya mengetik perintah file dan mengikutinya dengan file). Apakah itu benar? Apakah benar bahwa setiap kali perintah output 'File' berisi kata "teks" itu merujuk pada sesuatu yang dapat Anda baca dengan penampil teks, dan apa pun tanpa "teks" adalah semacam biner?

pengguna2543622
sumber
6
Di masa depan, memposting gambar output terminal benar-benar tidak direkomendasikan (atau dinikmati oleh siapa pun). Gunakan pemformatan blok kode markdown.
HalosGhost
3
Saya menghapus gambar dan memposting kode.
user2543622
Sama seperti catatan: Jika file tidak dapat mengidentifikasi file, sering kali TrID bisa. ia memiliki basis data sendiri tentang karakteristik file, dibuat oleh komunitas yang menggunakannya.
Josef berkata Reinstate Monica

Jawaban:

13

file menggunakan beberapa jenis tes :

1: Jika file tidak ada, tidak dapat dibaca, atau status file tidak dapat ditentukan, output akan menunjukkan bahwa file diproses, tetapi jenisnya tidak dapat ditentukan.

Ini akan menjadi output seperti cannot open file: No such file or directory.

2: Jika file tersebut bukan file biasa, jenis file-nya harus diidentifikasi. Direktori jenis file, FIFO, soket, blok spesial, dan karakter khusus harus diidentifikasi. Jenis file lain yang ditentukan implementasi juga dapat diidentifikasi. Jika file adalah tautan simbolis, secara default tautan harus diselesaikan dan file akan menguji jenis file yang dirujuk oleh tautan simbolis. (Lihat -hdan -iopsi di bawah.)

Ini akan menjadi output seperti .: directorydan /dev/sda: block special. Sebagian besar format untuk ini dan titik sebelumnya sebagian ditentukan oleh POSIX - Anda dapat mengandalkan string tertentu yang berada di output.

3: Jika panjang file adalah nol, itu harus diidentifikasi sebagai file kosong.

Ini foo: empty.

4: Utilitas file akan memeriksa segmen awal file dan akan membuat perkiraan untuk mengidentifikasi isinya berdasarkan tes sensitif posisi. (Jawabannya tidak dijamin benar; lihat opsi -d, -M, dan -m di bawah ini.)

5: Utilitas file akan memeriksa file dan membuat tebakan untuk mengidentifikasi isinya berdasarkan pada tes sistem standar yang sensitif terhadap konteks. (Jawabannya tidak dijamin benar.)

Keduanya menggunakan identifikasi angka ajaib dan merupakan bagian paling menarik dari perintah. Angka ajaib adalah urutan khusus byte yang ada di tempat yang dikenal dalam file yang mengidentifikasi tipenya. Secara tradisional tempat itu adalah dua byte pertama, tetapi istilah tersebut telah diperluas lebih lanjut untuk memasukkan string yang lebih panjang dan lokasi lainnya. Lihat pertanyaan lain ini untuk detail lebih lanjut tentang angka ajaib dalam fileperintah.

The fileperintah memiliki database nomor ini dan apa jenis mereka sesuai dengan; basis data itu biasanya ada /usr/share/mime/magic, dan memetakan konten file ke tipe MIME . Output di sana (sering bagian dari file -ijika Anda tidak mendapatkannya secara default) akan menjadi jenis media atau ekstensi yang ditentukan . "Tes sensitif terhadap konteks" menggunakan pendekatan yang sama, tetapi agak tidak jelas. Tidak satu pun dari ini dijamin benar, tetapi itu dimaksudkan sebagai tebakan yang baik.

filejuga memiliki database yang memetakan tipe-tipe tersebut ke nama-nama, yang dengannya ia akan mengetahui bahwa suatu file yang telah diidentifikasi application/pdfdapat digambarkan sebagai a PDF document. Nama-nama yang dapat dibaca manusia itu bisa dilokalisasi ke bahasa lain juga. Ini akan selalu menjadi deskripsi tingkat tinggi dari jenis file dengan cara yang akan dipahami seseorang, bukan mesin.

Sebagian besar keluaran berbeda yang bisa Anda dapatkan akan berasal dari tahap-tahap ini. Anda dapat melihat magicfile untuk daftar jenis yang didukung dan bagaimana mereka diidentifikasi - sistem saya tahu 376 jenis yang berbeda. Nama-nama yang diberikan dan jenis yang didukung ditentukan oleh pengemasan dan konfigurasi sistem Anda, sehingga sistem Anda mungkin mendukung lebih atau kurang dari milik saya, tetapi umumnya ada banyak. libmagicjuga menyertakan tes kode keras tambahan di dalamnya.

6: File harus diidentifikasi sebagai file data.

Ini foo: data, ketika gagal mengetahui apa pun tentang file tersebut.

Ada juga tag kecil lainnya yang bisa muncul. File yang dapat dieksekusi ( +x) akan menyertakan " executable" dalam output, biasanya dipisahkan dengan koma. The filepelaksanaan juga dapat mengetahui hal-hal ekstra tentang beberapa format file untuk dapat menggambarkan poin tambahan tentang mereka, seperti dalam Anda " PDF document, version 1.4".

Michael Homer
sumber
8

Halaman manual biasanya merupakan referensi singkat, bukan pengantar. Mulai dengan halaman Wikipedia .

filehanya melihat konten file, bukan pada nama file. (Ini juga terlihat pada beberapa metadata file seperti jenis file: direktori, tautan simbolik, bernama pipe, dll. Tetapi dalam kasus yang Anda minati, kontenlah yang penting.)

filebiasanya menebak format file dengan melihat beberapa byte pertama dan membandingkannya dengan tabel angka ajaib bawaan . Misalnya, jika file dimulai dengan %PDF, maka filelaporkan "dokumen PDF" (dan lanjutkan menggali untuk melaporkan versi minimum). Untuk jenis file yang tidak dimulai dengan angka ajaib, ini berisi heuristik, mis. Laporkan "teks ASCII" jika beberapa byte pertama semuanya berada dalam kisaran ASCII yang dapat dicetak.

Output dari filerapuh: dapat bervariasi dari varian unix ke varian unix dan dari versi ke versi. Di Linux, Cygwin dan * BSD, fileperintah mendukung opsi -iyang menghasilkan keluaran yang dapat diprediksi dalam bentuk jenis media MIME (IANA mengelola daftar jenis media standar ). Tidak ada banyak detail dan outputnya kurang ramah manusia tetapi outputnya mudah ditebak dan ramah komputer.

$ 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

Gunakan file --mime-typejika Anda hanya ingin tipe MIME itu sendiri tanpa informasi penyandian, mis application/pdf. Lewati opsi -bjika Anda tidak ingin menampilkan nama file di awal baris.

Gilles 'SO- berhenti menjadi jahat'
sumber
5

Saya ingin Anda membaca jawabannya dari sini . Beberapa kutipan dari jawabannya adalah,

Dari halaman manual fileperintah,

file perintah sebenarnya melakukan 3 tes untuk menentukan jenis file.

Tes pertama

Tes sistem file didasarkan pada pemeriksaan pengembalian dari pemanggilan sistem stat (2).

Tes kedua

Tes angka ajaib digunakan untuk memeriksa file dengan data dalam format tetap tertentu.

Tes ketiga

Tes bahasa mencari string tertentu (cf names.h) yang dapat muncul di mana saja dalam beberapa blok pertama file. Misalnya, kata kunci .br menunjukkan bahwa file tersebut kemungkinan besar merupakan file input troff (1), sama seperti kata kunci struct menunjukkan program C.

Output dari fileperintah umumnya didasarkan pada hasil dari salah satu tes yang berhasil.

Sekarang, dengan asumsi program C ++ dimulai seperti ini, dan tes ketiga berhasil,

#include <iostream.h>
bla
bla

Sesuai pengujian ketiga, kata kunci secara #includekhusus menentukan jenis program C meskipun kami memiliki program CPP . Sekarang, ketika saya memeriksa,

$ file example.cpp

example.cpp: ASCII C program text

Sekarang, konsep berorientasi objek khusus untuk C ++. Mari kita buat file khusus untuk C ++ .

Saya memulai program C ++ saya sebagai,

Class something
{
}
bla
bla

Sekarang, ketika saya menerbitkan

$ file example.cpp

Outputnya adalah,

example.cpp: ASCII C++ program text

Ini pada dasarnya menjelaskan tentang bagaimana fileperintah bekerja pada file yang serupa (Dalam contoh ini, program C dan program C ++ diperlakukan sama kecuali dan sampai kita menggunakan fitur berorientasi objek khusus untuk C ++).

Ramesh
sumber
1

Gilles dan Michael Homer telah memberikan jawaban yang sangat baik. yang saya rujuk kepada Anda. Untuk melihat jenis file yang dikenali pada sistem Anda, coba jalankan

cat /usr/share/magic

Jika itu memberikan masalah izin, atau tidak ada, maka mungkin

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

(mungkin perlu penyesuaian tergantung pada sistem Anda) yang akan menunjukkan kepada Anda daftar jenis file di sistem Anda. Perintah ini mungkin membutuhkan waktu lama untuk dijalankan tergantung pada ukuran sistem file root Anda.

Warwick
sumber