Lệnh phân loại tệp Linux


17

Tôi cần nhận ra loại dữ liệu chứa trong các tệp ngẫu nhiên. Tôi mới dùng Linux.

Tôi đang dự định sử dụng filelệnh để hiểu loại dữ liệu mà một tập tin có. Tôi đã thử lệnh đó và nhận được đầu ra bên dưới.

Ai đó đề nghị với tôi rằng filelệnh xem xét các byte ban đầu của tệp để xác định kiểu dữ liệu. Các filelệnh không nhìn vào một phần mở rộng tập tin nào cả. Đúng không? Tôi nhìn vào trang đàn ông nhưng cảm thấy nó quá kỹ thuật. Tôi sẽ đánh giá cao nếu bất cứ ai cũng có thể cung cấp một liên kết có giải thích đơn giản hơn nhiều về cách thức filehoạt động của lệnh.

Những câu trả lời khác nhau có thể có mà tôi có thể nhận được sau khi chạy filelệnh là gì? Ví dụ: trong bảng điểm bên dưới, tôi nhận được JPEG, phương tiện ISO, ASCII, v.v .:

Đầu ra màn hình như sau

 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


Cập nhật 1

Cảm ơn câu trả lời và họ đã làm rõ một vài điều cho tôi.

Vì vậy, nếu tôi hiểu chính xác thư mục / usr / share / mime / magic có cơ sở dữ liệu sẽ cung cấp cho tôi các định dạng tệp hiện tại có thể có (đầu ra mà tôi có thể nhận được khi nhập lệnh tệp và theo dõi tệp đó). đúng không? Có đúng là bất cứ khi nào đầu ra lệnh 'Tệp' chứa từ "văn bản", nó đề cập đến một cái gì đó mà bạn có thể đọc bằng trình xem văn bản và bất cứ thứ gì không có "văn bản" là một loại nhị phân?


6
Trong tương lai, việc đăng một bức ảnh về đầu ra thiết bị đầu cuối thực sự không được khuyến khích (hoặc được hưởng bởi bất kỳ ai). Sử dụng định dạng khối mã đánh dấu.
HalosGhost

3
Tôi xóa hình ảnh và đăng mã.
dùng2543622

Cũng như một lưu ý: Nếu tệp không thể xác định tệp, thường thì TrID có thể. nó có cơ sở dữ liệu riêng về các đặc điểm tệp, được tạo bởi cộng đồng sử dụng nó.
Josef

Câu trả lời:


13

file sử dụng một số loại thử nghiệm :

1: Nếu tệp không tồn tại, không thể đọc được hoặc không thể xác định trạng thái tệp của nó, đầu ra sẽ chỉ ra rằng tệp đã được xử lý, nhưng loại đó không thể được xác định.

Đây sẽ là đầu ra như thế nào cannot open file: No such file or directory.

2: Nếu tệp không phải là tệp thông thường, loại tệp sẽ được xác định. Thư mục loại tệp, FIFO, ổ cắm, khối đặc biệt và ký tự đặc biệt phải được xác định như vậy. Các loại tệp xác định thực hiện khác cũng có thể được xác định. Nếu tệp là một liên kết tượng trưng, ​​theo mặc định, liên kết sẽ được giải quyết và tệp sẽ kiểm tra loại tệp được tham chiếu bởi liên kết tượng trưng. (Xem -h-icác tùy chọn bên dưới.)

Đây sẽ là đầu ra như .: directory/dev/sda: block special. Phần lớn định dạng cho điểm này và điểm trước được xác định một phần bởi POSIX - bạn có thể dựa vào một số chuỗi nhất định có trong đầu ra.

3: Nếu độ dài của tệp bằng 0, nó sẽ được xác định là một tệp trống.

Đây là foo: empty.

4: Tiện ích tệp sẽ kiểm tra một phân đoạn ban đầu của tệp và sẽ đoán được việc xác định nội dung của nó dựa trên các thử nghiệm nhạy cảm với vị trí. (Câu trả lời không được đảm bảo là chính xác; xem các tùy chọn -d, -M và -m bên dưới.)

5: Tiện ích tệp sẽ kiểm tra tệp và đoán xem xác định nội dung của nó dựa trên các kiểm tra hệ thống mặc định theo ngữ cảnh. (Câu trả lời không được đảm bảo là chính xác.)

Hai người này sử dụng nhận dạng số ma thuật và là phần thú vị nhất của lệnh. Một con số kỳ diệu là một chuỗi đặc biệt của byte đó là ở một nơi được biết đến trong một file danh sách chỉ rõ loại của nó. Theo truyền thống, địa điểm đó là hai byte đầu tiên, nhưng thuật ngữ này đã được mở rộng hơn nữa để bao gồm các chuỗi dài hơn và các vị trí khác. Xem câu hỏi khác này để biết thêm chi tiết về số ma thuật trong filelệnh.

Các filelệnh có một cơ sở dữ liệu của những con số và những gì gõ chúng tương ứng với; cơ sở dữ liệu đó thường ở /usr/share/mime/magicvà ánh xạ nội dung tệp thành các loại MIME . Đầu ra ở đó (thường là một phần file -inếu bạn không nhận được theo mặc định) sẽ là loại phương tiện được xác định hoặc tiện ích mở rộng. "Các thử nghiệm nhạy cảm với bối cảnh" sử dụng cùng một cách tiếp cận, nhưng hơi khó hiểu hơn. Không ai trong số này được đảm bảo là đúng, nhưng họ dự định là những dự đoán tốt.

filecũng có một cơ sở dữ liệu ánh xạ các loại đó thành tên, theo đó nó sẽ biết rằng một tệp mà nó đã xác định là application/pdfcó thể được mô tả là a PDF document. Những tên dễ đọc của con người cũng có thể được định vị sang ngôn ngữ khác. Đây sẽ luôn là một số mô tả cấp cao về loại tệp theo cách mà một người sẽ hiểu, chứ không phải là một máy.

Phần lớn các kết quả đầu ra khác nhau mà bạn có thể nhận được sẽ đến từ các giai đoạn này. Bạn có thể xem magictệp để biết danh sách các loại được hỗ trợ và cách chúng được xác định - hệ thống của tôi biết 376 loại khác nhau. Tên được cung cấp và các loại được hỗ trợ được xác định bởi bao bì và cấu hình hệ thống của bạn và do đó hệ thống của bạn có thể hỗ trợ nhiều hơn hoặc ít hơn tên của tôi, nhưng nhìn chung có rất nhiều trong số chúng. libmagiccũng bao gồm các bài kiểm tra mã hóa bổ sung trong đó.

6: Tệp phải được xác định là tệp dữ liệu.

Đây là foo: data, khi nó không thể tìm ra bất cứ điều gì về tập tin.

Ngoài ra còn có các thẻ nhỏ khác có thể xuất hiện. +xTệp thực thi ( ) sẽ bao gồm " executable" trong đầu ra, thường được phân tách bằng dấu phẩy. Việc filetriển khai cũng có thể biết thêm những điều về một số định dạng tệp để có thể mô tả các điểm bổ sung về chúng, như trong "" của bạn PDF document, version 1.4.


8

Trang người đàn ông thường là tài liệu tham khảo ngắn gọn, không giới thiệu. Bắt đầu với trang Wikipedia .

filechỉ nhìn vào nội dung tập tin, không nhìn vào tên tập tin. (Nó cũng xem xét một số siêu dữ liệu tệp như loại tệp: thư mục, liên kết tượng trưng, ​​đường ống có tên, v.v. Nhưng trong trường hợp bạn quan tâm, đó là nội dung quan trọng.)

filethường đoán định dạng của một tệp bằng cách nhìn vào một vài byte đầu tiên và so sánh chúng với một bảng số ma thuật tích hợp . Ví dụ: nếu tệp bắt đầu bằng %PDF, sau đó filebáo cáo tài liệu PDF PDF (và đi sâu hơn để báo cáo phiên bản tối thiểu). Đối với các loại tệp không bắt đầu bằng số ma thuật, nó chứa các heuristic, ví dụ: báo cáo văn bản ASCII văn bản nếu một vài byte đầu tiên nằm trong phạm vi ASCII có thể in được.

Đầu ra của filerất dễ vỡ: nó có thể thay đổi từ biến thể unix sang biến thể unix và từ phiên bản này sang phiên bản khác. Trên Linux, Cygwin và * BSD, filelệnh hỗ trợ một tùy chọn -itạo đầu ra có thể dự đoán dưới dạng loại phương tiện MIME (IANA quản lý danh sách các loại phương tiện tiêu chuẩn ). Không có nhiều chi tiết và đầu ra ít thân thiện với con người hơn nhưng đầu ra có thể dự đoán được và thân thiện với máy tính.

$ 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

Sử dụng file --mime-typenếu bạn chỉ muốn loại MIME mà không cần mã hóa thông tin, ví dụ application/pdf. Vượt qua tùy chọn -bnếu bạn không muốn hiển thị tên tệp ở đầu dòng.


5

Tôi muốn bạn đọc câu trả lời từ đây . Một số trích đoạn từ câu trả lời là,

Từ trang man của filelệnh,

file lệnh thực sự thực hiện 3 bài kiểm tra về việc xác định loại tệp.

Thử nghiệm đầu tiên

Các kiểm tra hệ thống tập tin được dựa trên việc kiểm tra sự trở lại từ một cuộc gọi hệ thống stat (2).

Thử nghiệm thứ hai

Các bài kiểm tra số ma thuật được sử dụng để kiểm tra các tệp có dữ liệu ở các định dạng cố định cụ thể.

Bài kiểm tra thứ ba

Các bài kiểm tra ngôn ngữ tìm kiếm các chuỗi cụ thể (cf name.h) có thể xuất hiện ở bất cứ đâu trong một vài khối đầu tiên của tệp. Ví dụ: từ khóa .br chỉ ra rằng tệp rất có thể là tệp đầu vào troff (1), giống như từ khóa struct chỉ ra chương trình C.

Đầu ra của file lệnh thường dựa trên kết quả của bất kỳ thử nghiệm nào thành công.

Bây giờ, giả sử chương trình C ++ bắt đầu như thế này và thử nghiệm thứ ba thành công,

#include <iostream.h>
bla
bla

Theo thử nghiệm thứ ba, từ khóa #includeđặc biệt chỉ định nó thuộc chương trình loại C mặc dù chúng tôi có sẵn chương trình CPP . Bây giờ, khi tôi kiểm tra,

$ file example.cpp

example.cpp: ASCII C program text

Bây giờ, các khái niệm về hướng đối tượng là đặc trưng cho C ++. Hãy để chúng tôi tạo một tệp cụ thể để C ++ .

Tôi bắt đầu chương trình C ++ của mình như,

Class something
{
}
bla
bla

Bây giờ, khi tôi phát hành

$ file example.cpp

Đầu ra là,

example.cpp: ASCII C++ program text

Điều này về cơ bản giải thích cách filehoạt động của lệnh trên các tệp tương tự (Trong ví dụ này, chương trình C và chương trình C ++ được xử lý như nhau trừ khi và cho đến khi chúng tôi sử dụng các tính năng hướng đối tượng cụ thể cho C ++).


1

Gilles và Michael Homer đã cung cấp câu trả lời tuyệt vời. mà tôi giới thiệu bạn đến. Để xem các loại tệp được nhận dạng trên hệ thống của bạn, hãy thử chạy

cat /usr/share/magic

Nếu điều đó cho phép các vấn đề hoặc không tồn tại, thì có thể

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

(có thể cần điều chỉnh tùy thuộc vào hệ thống của bạn) sẽ hiển thị cho bạn danh sách các loại tệp trên hệ thống của bạn. Lệnh này có thể mất nhiều thời gian để chạy tùy thuộc vào kích thước của hệ thống tệp gốc của bạn.

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.