Files

查找所有“非二進制”文件

  • April 17, 2019

是否可以使用該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並不完美。它非常擅長檢測文件中的數據類型,但有時會感到困惑。

我過去多次成功地使用過這種方法的許多變體。

引用自:https://unix.stackexchange.com/questions/46276