查找所有“非二進制”文件
是否可以使用該
find
命令查找目錄中的所有“非二進制”文件?這是我要解決的問題。我收到了來自 Windows 使用者的文件存檔。此存檔包含原始碼和圖像文件。我們的建構系統不能很好地處理具有 windows 行結尾的文件。我有一個命令行程序 (
flip -u
),它將在 *nix 和 windows 之間翻轉行尾。所以,我想做這樣的事情find . -type f | xargs flip -u
但是,如果對圖像文件或其他二進制媒體文件執行此命令,則會損壞文件。我意識到我可以建立一個文件副檔名列表並使用它進行過濾,但我寧願擁有一些不依賴於我保持該列表最新的東西。
那麼,有沒有辦法在目錄樹中找到所有非二進製文件?還是我應該考慮其他解決方案?
我會使用
file
輸出並將其通過管道傳輸到 grep 或 awk 以查找文本文件,然後僅提取輸出的文件名部分file
並將其傳輸到 xargs。就像是:
file * | awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u
請注意,grep 搜尋“ASCII 文本”而不是任何“文本”——您可能不想弄亂富文本文件或 unicode 文本文件等。
您還可以使用
find
(或其他)生成要檢查的文件列表file
:find /path/to/files -type f -exec file {} + | \ awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u
xargs的
-d'\n'
參數使 xargs 將每個輸入行視為一個單獨的參數,從而滿足帶有空格和其他有問題字元的文件名。xargs -0
即,它是輸入源不生成或不能生成 NULL 分隔輸出(例如find
’s-print0
選項)時的替代方案。根據更改日誌,xargs 在 2005 年 9 月獲得了-d
/--delimiter
選項,因此應該在任何非古代 linux 發行版中(我不確定,這就是我檢查的原因 - 我只是模糊地記得這是一個“最近”添加)。請注意,換行符是文件名中的有效字元,因此如果任何文件名中有換行符,這將中斷。對於典型的 unix 使用者來說,這在病態上是瘋狂的,但如果文件源自 Mac 或 Windows 機器,這並非聞所未聞。
另請注意,這
file
並不完美。它非常擅長檢測文件中的數據類型,但有時會感到困惑。我過去多次成功地使用過這種方法的許多變體。