2010-09-07 76 views
6

如何在不打開文件的情況下驗證文件是二進制還是文本?linux +驗證文件是文本還是二進制

+0

很難判斷這是與編程有關還是應該遷移到SuperUser.com(是否是一個現有的實用工具?)。 – Johnsyweb 2010-09-07 08:57:08

+0

文本至多是二進制的一個子集,如果不僅僅是一種解釋。考慮一個包含「0x65」的單字節文件。現在告訴我,如果這是二進制或文本。 – MSalters 2010-09-07 09:03:54

+0

在驗證之前如何複製文件。複製 - >打開 - >驗證 - >刪除 – 2010-09-07 11:06:24

回答

2

如果不查看文件內容,就沒有辦法確定。 Hoewever,你不必用編輯器打開它,看看自己是否有線索。你可能想看看file命令:http://linux.die.net/man/1/file

9

薛丁格的貓,恐怕。

如果不打開它,無法確定文件的內容。文件系統不存儲與內容相關的元數據。

如果不打開文件不是一個硬性要求,那麼有很多解決方案可供您使用。

編輯:

有人提出了一些意見和答案是file(1)是確定內容的一個好辦法。它的確是。然而,file(1)打開該文件,這是在問題中禁止。見倒數第二行下面的例子:

> 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

unix命令文件在啓發式確定類型時做得很好 – Joel 2010-09-07 09:08:44

+0

@Joel:是的。它也打開文件。 – Johnsyweb 2010-09-07 09:34:15

+1

這個問題太模糊,不知道「開放」是否意味着開放(2)。 「開放」還有其他內涵。 – camh 2010-09-07 11:45:38

2

如果你正試圖從命令shell做到這一點,則file命令將採取什麼對文件類型是一種猜測。如果是文本,那麼它通常會在其描述中包含文字。

我不知道有任何100%的方法來確定這一點,但文件命令可能是最準確的。

+1

當然,這會打開文件,並不會100%確定。 – 2010-09-07 09:10:40

+1

事實確實如此,儘管我不確定他是否反對自己打開文件或打開文件。我已經說過沒有100%確定的方法。 – 2010-09-07 09:12:16

2

在unix中,文件只是一些字節。所以,在不打開文件的情況下,你無法弄清100%是ASCII還是二進制。

您可以使用可用的工具並深入挖掘,以使其更加安全。

  1. 文件
  2. 貓-v
6

正確的方法來確定一個文件的類型是使用文件(1)命令。

您還需要知道UTF-8編碼文件是「文本」文件,但可能包含非ASCII數據。其他編碼也有這個問題。在使用code page編碼的文本的情況下,可能無法明確確定文件是否爲文本。

文件(1)命令將着眼於文件的結構,嘗試確定它所包含的內容 - 從文件(1)手冊頁:

打印的類型通常包含的 一個話文本(文件 只包含打印字符和 一些常見的控制字符,是 可能是安全的在ASCII 終端讀取),可執行(該文件包含 在 形式理解一些UNIX內核 或其他編譯程序的結果),或數據意味着什麼 其他(數據通常是「二進制」或不可打印)。

對於不同的字符編碼,文件(1)手冊頁有這樣一段話:

如果文件不匹配魔術文件的任何 條目,它是 檢查它是否看起來像是一個文本文件。 ASCII,ISO-8859-x,非ISO ISO 8位擴展ASCII字符集和 EBCDIC字符集可以通過構成每個集合中可打印文本的不同範圍 和 來區分。 如果文件 通過了任何這些測試,則會報告其字符集。 ASCII, ISO-8859-x,UTF-8和擴展ASCII文件被標識爲 '文本' ,因爲它們幾乎可以在任何終端上讀取; UTF-16和 EBCDIC只是'字符數據',因爲儘管它們包含文本,但 是 文本,在它可以被讀取之前需要進行翻譯。

所以,有些文本將被認定爲文本,但有些人可能會被認定爲字符數據。您需要確定自己是否對您的申請有影響並採取適當的行動。

相關問題