行情增加了淨度:
運行在一個文件中的「文件」命令來查看該文件是否爲文本文件或二進制數據文件!
file
命令將檢查文件並告訴你它們看起來是什麼類型的文件。 「文本」一詞將(幾乎)總是在文本文件的描述中。
例如:
desktop.ini: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
tw2-wasteland.jpg: JPEG image data, JFIF standard 1.02
所以第一部分是問你運行file
命令,並解析其輸出。
我只是無法確定「人類可讀內容」是什麼,因爲我假設它意味着除了二進制/程序集之外的任何東西,但我認爲這就是-type f顯示。
find -type f
查找文件。它過濾掉其他文件系統對象,如目錄,符號鏈接和套接字。它將匹配任何類型的文件,但:二進制文件,文本文件,任何東西。
也許這就是教授所說的「詭計問題」的意思?
這聽起來像他只是說不要find -name '*.txt'
或一些這樣的命令來查找文本文件。不要假設特定的文件擴展名。文件擴展名在UNIX中的含義遠遠低於Windows中的含義。很多文件甚至沒有文件擴展名!
我想教授希望我們能夠在所有文件上運行文件命令和計數的人,在這「文」的數量。
多部分答案如何?我將在#1中給出直接的解決方案,這可能是您的教授正在尋找的。如果您有興趣,我會解釋它的缺點以及如何改進它。
一種方法是使用xargs
,如果你已經瞭解了這一點。 xargs
運行另一個命令,使用來自stdin的數據作爲該命令的參數。
$ find . -type f | xargs file
./netbeans-6.7.1.desktop: ASCII text
./VMWare.desktop: a /usr/bin/env xdg-open script text executable
./VMWare: cannot open `./VMWare' (No such file or directory)
(copy).desktop: cannot open `(copy).desktop' (No such file or directory)
./Eclipse.desktop: a /usr/bin/env xdg-open script text executable
這是行得通的。有點。這對於做家庭作業來說足夠了。但對於真實世界的腳本來說還不夠好。
注意它是如何打破文件VMWare (copy).desktop
,因爲它有一個空間。這是由於xargs
的分割參數的默認行爲。我們可以通過使用xargs -0
在NUL字符而不是空格上拆分命令參數來解決這個問題。文件名不能包含NUL字符,所以這將能夠處理任何事情。
$ find . -type f -print0 | xargs -0 file
./netbeans-6.7.1.desktop: ASCII text
./VMWare.desktop: a /usr/bin/env xdg-open script text executable
./VMWare (copy).desktop: a /usr/bin/env xdg-open script text executable
./Eclipse.desktop: a /usr/bin/env xdg-open script text executable
這對於生產腳本來說已經足夠了,而且會遇到很多問題。但我個人更喜歡另一種不需要管道的語法,所以效率稍高一些。
$ find . -type f -exec file {} \;
./netbeans-6.7.1.desktop: ASCII text
./VMWare.desktop: a /usr/bin/env xdg-open script text executable
./VMWare (copy).desktop: a /usr/bin/env xdg-open script text executable
./Eclipse.desktop: a /usr/bin/env xdg-open script text executable
要理解的是,-exec
調用file
反覆,用它找到的每個文件名替換{}
。分號\;
標誌着file
命令的結束。
不,'find -type f'不包括目錄,設備節點等(「規範ial files「),即純文件以外的文件系統對象。它根本不檢查文件的內容,只檢查目錄條目(inode)中的類型信息。 Unix在「二進制」和「文本」文件之間沒有任何區別(並且對這個Unix的頭文件來說,任何試圖定義這種區別的嘗試都會變得很滑)。 – tripleee