Làm thế nào là loại tệp được biết nếu không phải từ hậu tố tập tin?


55

Tôi muốn biết làm thế nào các loại tệp được biết nếu tên tệp không có hậu tố.

Ví dụ, một tệp có tên myfilelà nhị phân hoặc văn bản để bắt đầu, làm thế nào để hệ thống biết nếu tệp là nhị phân hoặc văn bản?


3
Chỉ cần một nhận xét, phần còn lại của câu trả lời bao gồm tất cả mọi thứ. Ngày nay, có thể xảy ra rằng với một ngôn ngữ được định cấu hình sai hoặc các tệp thực thi cũ, một số tệp utf-8 có thể bị xác định sai là dữ liệu nhị phân do các byte không phải là ascii.
orion

19
Hệ thống không quan tâm. Một số ứng dụng có thể quan tâm, nhưng mỗi ứng dụng có cách xử lý riêng.
jwodder

2
Lưu ý rằng ngay cả đối với các tệp thông thường (không phải tệp thiết bị, ổ cắm tên miền unix, ống có tên, v.v.) "loại tệp" có thể có nghĩa là hai điều khác nhau: (1) Một định dạng tệp cụ thể (".docx", XML, định dạng văn bản MS-DOS , RTF, các bản ghi có độ dài cố định, danh sách có thể rất dài) hoặc (2) Một tệp mà một ứng dụng cụ thể biết cách xử lý (".xlsx" hoặc ".doc" hoặc bất cứ điều gì, có trùng với loại định dạng) . Thật đáng để lưu ý đến sự khác biệt đó khi nói về "loại tệp".
Bruce Ediger

@jwodder Hệ thống nào quan tâm. Đó là hệ thống phàn nàn rằng bạn không thể thực thi một tệp không thể thực thi khi bạn cố gắng, không phải các ứng dụng đó!
Ông Lister

1
@MrLister Đúng, nhưng thực thi / không thực thi không liên quan gì đến 'phần mở rộng'.
dùng2338816

Câu trả lời:


84

Các filetiện ích xác định filetype qua 3 cách:

Đầu tiên là kiểm tra hệ thống tập tin : Trong những thử nghiệm một trong những stat hệ thống gia đình các cuộc gọi được gọi vào tệp. Điều này trả về các loại tệp unix khác nhau : tệp thông thường, thư mục, liên kết, thiết bị ký tự, thiết bị khối, đường ống có tên hoặc ổ cắm. Tùy thuộc vào đó, các bài kiểm tra ma thuật được thực hiện.

Các bài kiểm tra ma thuật phức tạp hơn một chút. Các loại tệp được đoán bởi cơ sở dữ liệu các mẫu được gọi là tệp ma thuật . Một số loại tệp có thể được xác định bằng cách đọc một bit hoặc số ở một vị trí cụ thể trong tệp (ví dụ nhị phân). Tệp ma thuật chứa " số ma thuật " để kiểm tra tệp có chứa chúng hay không và thông tin văn bản nào sẽ được in. Những " số ma thuật " đó có thể là các giá trị 1-4Byte, chuỗi, ngày hoặc thậm chí là các biểu thức thông thường. Với các bài kiểm tra thêm thông tin có thể được tìm thấy. Trong trường hợp có thể thực thi được, thông tin bổ sung sẽ là liệu nó có được liên kết động hay không, bị tướchoặc không hoặc kiến ​​trúc. Đôi khi nhiều bài kiểm tra phải vượt qua trước khi loại tập tin thực sự có thể được xác định. Nhưng dù sao đi nữa, không quan trọng là có bao nhiêu bài kiểm tra được thực hiện, nó luôn chỉ là một phỏng đoán tốt .

Dưới đây là 8 byte đầu tiên trong một tệp của một số kiểu tệp phổ biến có thể giúp chúng ta cảm nhận được những con số ma thuật này có thể trông như thế nào:

             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

Nếu loại tệp không thể được tìm thấy qua các bài kiểm tra ma thuật, thì tệp đó dường như là một tệp văn bản và filetìm mã hóa nội dung. Mã hóa được phân biệt bởi các phạm vi và chuỗi byte khác nhau tạo thành văn bản có thể in trong mỗi bộ.

Việc ngắt dòng cũng được điều tra, tùy thuộc vào giá trị HEX của chúng:

  • 0A( \n) phân loại tệp kết thúc Un * x / Linux / BSD / OSX
  • 0D 0A( \r\n) là tệp từ hệ điều hành Microsoft
  • 0D( \r) sẽ là Mac OS cho đến phiên bản 9
  • 15( \025) sẽ là IBM AIX

Bây giờ các bài kiểm tra ngôn ngữ bắt đầu. Nếu nó có vẻ là một tệp văn bản, tệp sẽ được tìm kiếm các chuỗi cụ thể để tìm ra ngôn ngữ mà nó chứa (C, Perl, Bash). Một số ngôn ngữ tập lệnh cũng có thể được xác định qua hàm băm ( #!/bin/interpreter) trong dòng đầu tiên của tập lệnh.

Nếu không có gì áp dụng cho tệp, loại tệp không thể được xác định và filechỉ in "dữ liệu".

Vì vậy, bạn thấy không cần hậu tố. Một hậu tố dù sao cũng có thể gây nhầm lẫn, nếu đặt sai.


4
Ngoài ra còn có cơ sở dữ liệu MIME được chia sẻ freedesktop.org, được sử dụng bởi tất cả các ứng dụng X11. Khái niệm này tương tự như những gì file(1), nhưng với cách thực hiện (rất) khác nhau.
lcd047

4
Lưu ý rằng kết quả của quá trình này về cơ bản là dự đoán và không nên dựa vào bất cứ điều gì quan trọng. (Các tính năng tiện lợi, như quyết định chương trình mặc định để mở tệp, vẫn ổn)
user253751

Vì vậy, nếu tôi thêm% PNG ở đầu tệp văn bản, nó sẽ được xem là tệp png. Đúng??
saga

@saga Nếu bạn nhận được mã hóa đúng và nếu bạn đặt một ký hiệu mille thay vì dấu phần trăm thì: có thể. Có thể có các xét nghiệm bổ sung.
Bananguin

19

Thông thường, nó không quan tâm. Bạn chỉ cần chuyển nó đến một chương trình và nó sẽ giải thích nó hoặc không. Có thể không hữu ích khi mở .jpg trong trình soạn thảo văn bản, nhưng bạn không bị ngăn làm điều này. Phần mở rộng, giống như phần còn lại của tên tệp, là để thuận tiện cho tổ chức của con người.

Cũng có thể xây dựng các tệp có thể được giải thích hợp lệ theo nhiều cách. Vì định dạng tệp ZIP bắt đầu có một tiêu đề ở cuối tệp , bạn có thể thêm các thứ khác vào phía trước và nó vẫn sẽ tải dưới dạng tệp ZIP. Điều này thường được sử dụng để tạo các tệp zip tự giải nén.


4
Đoạn cuối: Định dạng tệp Funky là một cuộc nói chuyện thú vị về chủ đề đó, trình bày ví dụ như một jpeg cũng là một chương trình java hello world, sau khi AES mã hóa nó thành PNG hoặc sau khi 3DES giải mã nó sẽ trở thành PDF và hơn thế nữa ( tất cả đều có nội dung "thú vị", tức là không chỉ với tiếng ồn trắng hoặc đồ tạo tác)
Hagen von Eitzen

14

Thông tin đó thường được tìm thấy trong tiêu đề của tập tin. Các filelệnh phân tích các mục tiêu và cho bạn biết thông tin về các tập tin. Rất nhiều thông tin thường được lấy từ các tiêu đề tệp thường gấp vài byte đầu tiên của tệp (xem bên dưới). Các tiêu đề được sử dụng bởi hệ thống để tìm ra cách xử lý các tệp. #!/bin/bashở đầu tập tin báo cho hệ thống sử dụng bash shell để diễn giải đoạn script sau. ELFnói với hệ thống rằng đây là một thực thi 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

Ví dụ tiêu đề tệp:

[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
Điều này là khá sai lệch. Các tệp Unix không có "tiêu đề" mỗi se. Các filelệnh cố gắng đoán từ các nội dung của tập tin như thế nào các tập tin có lẽ là dự định được sử dụng. Nó không phải là không thể sai lầm.
Nate Eldredge

Bạn đúng trong cách bạn giải thích hành vi của file. Nó thực sự làm cho một phân tích của các tập tin. Tuy nhiên, hầu hết các loại tệp được xác định bởi một tiêu đề sắp xếp. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............là một tiêu đề của một thực thi ELF (vài byte đầu tiên của / bin / ls). Tương tự #!/bin/bashở đầu tệp ASCII sẽ xác định nó là tập lệnh shell. Một ví dụ khác: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(một hình ảnh .png)
h3rrmiller

2
Nhưng câu trả lời của bạn làm cho nó có vẻ như một tiêu đề là một tính năng vốn có của một tệp Unix. Ví dụ, tệp văn bản không có tiêu đề như vậy; ai đó như OP có thể sẽ xem xét tệp nguồn C và tệp nguồn Java có "loại tệp" khác nhau, nhưng không có tiêu đề để phân biệt chúng. Tôi sẽ lập luận rằng "loại tệp" thậm chí không phải là một khái niệm có ý nghĩa trong Unix; hệ điều hành chỉ cung cấp một hệ thống tệp và tùy thuộc vào từng ứng dụng để quyết định nội dung của bất kỳ tệp nào.
Nate Eldredge

Tôi đồng ý. Tôi đã cố gắng trả lời một cách đơn giản nhất có thể mà không đi xuống quá nhiều lỗ thỏ.
h3rrmiller

7

Điều đầu tiên cần kiểm tra là loại tệp được mã hóa cứng được nhận dạng bởi kernel. Đây là các loại tệp như thư mục, tệp đặc biệt, tệp đặc biệt khối, tệp đặc biệt ống, ổ cắm và liên kết tượng trưng. Thông tin này đến từ inode của tập tin. Nếu tệp là một tệp đơn giản, bộ thông tin tiếp theo đến từ 256 byte đầu tiên bằng cách tìm kiếm các mẫu. Do đó, các tệp văn bản và mã nguồn C được nhận ra bằng cách kiểm tra các byte đó. Ngoài ra, các tiện ích cũng tìm kiếm một số ma thuật được sử dụng để kiểm tra và xác nhận loại tệp. Bạn có thể thêm các loại tệp của riêng mình để được nhận dạng bằng cách thêm thông tin vào tệp /etc/magic. Tham khảo trang hướng dẫn magic(5)để xem định dạng của tệp ma thuật.

Trong triển khai cũ hơn (ví dụ Solaris), tệp /etc/magicliệt kê hầu hết các loại tệp được nhận dạng.


4

Các filelệnh áp dụng một số chẩn đoán từ kiểm tra (một phần) các tập tin và thực hiện một đoán đủ điều kiện. Ngoài ra, có một số trường hợp đặc biệt có thể lấy thông tin bổ sung; như #!ở phần đầu của tệp văn bản, BoM (dấu thứ tự byte) hoặc byte tiêu đề cụ thể của các định dạng tệp thực thi. Các #!dấu và nhị phân trong các tệp thực thi được sử dụng bởi hệ thống để phân biệt chúng.


4

Hệ thống không biết liệu tệp là nhị phân hay văn bản. Trong tất cả (AFAIK) các hệ điều hành loại Unix, fopen(path, "rb")hoàn toàn giống như fopen(path "r")- bkhông có tác dụng. Điều này được chấp nhận vì tiêu chuẩn C cần có thể được chuyển sang một số HĐH khác tạo nên sự khác biệt như vậy.


0

Tôi sẽ lập luận rằng "loại tệp" thậm chí không phải là một khái niệm có ý nghĩa trong Unix;

Trong những ngày tốt đẹp của những người chuyển đổi máy tính lớn, hệ điều hành của họ đã hỗ trợ một số loại tệp bao gồm tuần tự và tuần tự chỉ mục. Các hệ điều hành hiện đại (Un * x và Windows được cho là) ​​giảm tập hợp các loại tệp xuống mức tối thiểu (bao gồm cả đối tượng dùng chung, có thể thực hiện được).

Cũng có thể xây dựng các tệp có thể được giải thích hợp lệ theo nhiều cách

Có thể, có một định dạng tệp khó: một đoạn mã C có thể được hiểu là một mô tả hình ảnh. Bên cạnh đó có các định dạng khác nhau ít hơn và cụ thể hơn: tệp văn bản, tệp XML, tài liệu SOAP.


1
Khi định dạng tệp đi, XPM không phải là khó khăn. Tôi coi "khó khăn" để bắt đầu với thứ gì đó vừa là tệp JPEG hợp lệ vừa là tệp ZIP hợp lệ.
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.