2010-09-07 33 views
6

Làm cách nào để xác minh xem tệp đó có phải là tệp nhị phân hoặc văn bản mà không cần mở tệp không?linux + xác minh xem tệp có phải là văn bản hoặc nhị phân

+0

Thật khó để biết đây là chương trình có liên quan hay liệu nó có nên được di chuyển sang SuperUser.com hay không (là một tiện ích hiện có được tìm sau?). – Johnsyweb

+0

Văn bản tốt nhất là một tập con nhị phân, nếu không chỉ đơn thuần là một giải thích. Hãy xem xét tệp một byte chứa '0x65'. Bây giờ cho tôi biết hoàn toàn nếu đây là nhị phân hoặc văn bản. – MSalters

+0

sao chép tệp trước khi xác minh. copy -> open -> verify -> xóa –

Trả lời

2

Không có cách nào chắc chắn mà không nhìn vào bên trong tệp. Hoewever, bạn không cần phải mở nó với một biên tập viên và xem cho chính mình để có một đầu mối. Bạn có thể muốn xem xét lệnh file: http://linux.die.net/man/1/file

9

Con mèo của Schrödinger, tôi sợ.

Không có cách nào để xác định nội dung của tệp mà không cần mở tệp. Hệ thống tệp không lưu trữ siêu dữ liệu liên quan đến nội dung.

Nếu không mở tệp không phải là một yêu cầu khó, thì có một số giải pháp có sẵn cho bạn.

Edit:

Nó đã được đề xuất trong một số ý kiến ​​và câu trả lời mà file(1) là một cách tốt để xác định nội dung. Thật vậy. Tuy nhiên, file(1)mở tệp đã bị cấm trong câu hỏi. Xem dòng áp chót trong ví dụ sau:

> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg 
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0 
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
open("file.jpg", O_RDONLY|O_LARGEFILE) = 3 
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text 
+1

Tệp lệnh unix thực hiện tốt công việc xác định kiểu – Joel

+0

@Joel: Có. Nó cũng mở tập tin. – Johnsyweb

+1

Câu hỏi là quá mơ hồ để biết nếu "mở" có nghĩa là mở (2). "Mở" có ý nghĩa khác. – camh

2

Nếu bạn đang cố gắng để làm điều này từ một tiện ích dòng lệnh thì lệnh file sẽ mất một đoán vào những gì filetype nó được. Nếu đó là văn bản thì nó thường sẽ bao gồm văn bản từ trong mô tả của nó.

Tôi không biết về bất kỳ phương pháp xác định 100% nào nhưng lệnh tệp có lẽ là chính xác nhất.

+1

Tất nhiên là mở tập tin và sẽ không chắc chắn 100%. –

+1

Thật vậy, mặc dù tôi không chắc liệu anh ta có nghịch hay không khi mở tập tin hay có tiện ích mở nó. Tôi đã tuyên bố rằng không có phương pháp 100% nào đó để làm điều này. –

2

Trong unix, tệp chỉ là một số byte. Vì vậy, mà không cần mở tập tin, bạn không thể tìm ra 100% đó là ASCII hoặc nhị phân.

Bạn chỉ có thể sử dụng các công cụ có sẵn cho bạn và tìm hiểu sâu hơn để làm cho bằng chứng dễ dàng.

  1. tập tin
  2. mèo -v
6

Các cách chính xác để xác định loại của một file là sử dụng các tập tin (1) lệnh.

Bạn cũng cần lưu ý rằng các tệp được mã hóa UTF-8 là các tệp "văn bản", nhưng có thể chứa dữ liệu không phải ASCII. Các mã hóa khác cũng có vấn đề này. Trong trường hợp văn bản được mã hóa với một số code page, có thể không xác định rõ ràng liệu tệp có phải là văn bản hay không.

Các tập tin (1) lệnh sẽ nhìn vào cấu trúc của một tập tin để thử và xác định những gì nó chứa - từ tập tin (1) người đàn ông trang:

Các loại in thường sẽ chứa một trong những lời văn bản (file chỉ chứa ký tự in ấn và một vài ký tự điều khiển thông thường và là lẽ an toàn để đọc trên một ASCII terminal), thực thi (tập tin chứa kết quả của việc biên soạn một chương trình trong một hình thức hiểu đối với một số UNIX kernel này hay cách khác), hoặc dữ liệu nghĩa gì khác (dữ liệu thường là ‘nhị phân’ hay không thể in được).

đối với bảng mã ký tự khác nhau Với, các tập tin (1) người đàn ông đã cho biết:

Nếu một tập tin không phù hợp với bất kỳ mục trong tập tin kỳ diệu, nó là kiểm tra xem nó có phải là một tập tin văn bản hay không. ASCII, ISO-8859-x, non- Bộ ký tự ASCII được mở rộng ISO-bit (chẳng hạn như được sử dụng trên Macintosh và hệ thống PC của IBM), mã hóa UTF-8, mã hóa UTF-16 mã hóa và Bộ ký tự EBCDIC có thể được phân biệt bằng các phạm vi khác nhau: và chuỗi byte tạo thành văn bản có thể in trong mỗi bộ. Nếu một tệp vượt qua bất kỳ thử nghiệm nào trong số này, bộ ký tự của nó sẽ được báo cáo. ASCII, ISO-8859-x, UTF-8 và các tệp ASCII mở rộng được xác định là ‘văn bản’ vì chúng hầu như có thể đọc được trên hầu hết mọi thiết bị đầu cuối; UTF-16 và EBCDIC chỉ là 'dữ liệu ký tự' bởi vì, trong khi chúng chứa văn bản, văn bản là yêu cầu dịch trước khi có thể đọc được.

Vì vậy, một số văn bản sẽ được xác định là văn bản, nhưng một số có thể được xác định là dữ liệu nhân vật. Bạn sẽ cần phải tự xác định xem điều này có quan trọng với ứng dụng của mình hay không và thực hiện hành động thích hợp.

Các vấn đề liên quan