遞歸地將 Windows 文件轉換為 Unix 文件
我有一個 PHP 應用程序,它位於 Linux 上,有多個目錄(和子目錄)和許多 PHP、JS、HTML、CSS 等文件。許多文件都有 Windows EOL 控製字元,我還擔心有些文件可能不是 UTF-8 編碼,但可能是 ISO-8859-1、Windows-1252 等。我希望使用 LF 將所有文件轉換為 UTF-8只要。
看起來我可能有幾個步驟。
dos2unix man 提供了這個解決方案:
find . -name *.txt |xargs dos2unix
https://stackoverflow.com/a/11929475提供了這個解決方案:
find . -type f -print0 | xargs -0 dos2unix
https://stackoverflow.com/a/7068241提供了這個解決方案:
find ./ -type f -exec dos2unix {} \;
我認識到第一個只會轉換不是我想要的 txt 文件,但我可以輕鬆更改為使用
-type f
. 話雖如此,一種解決方案是否比另一種解決方案“更好”?如果是這樣,為什麼?是否可以在不更改文件的情況下判斷哪些文件將被更改?當我最終更改它們時,我不想更改日期,並打算使用 dos2unix 的--keepdate
標誌。是否應該使用任何其他選項?接下來,我需要處理編碼。 https://stackoverflow.com/a/805474/1032531>推薦`enca`(或其姊妹命令`encov`)和<https://stackoverflow.com/a/64889/1032531推薦
iconv
。它似乎也file
可能適用。同樣,應該使用哪一個(或者可能是其他所有東西)?我安裝enca
並執行時enca --list languages
,它列出了幾種語言,但沒有列出英語(也許選擇“無”?),我的問題是適用性。iconv
已經安裝了,但是,它沒有手冊頁(至少man iconv
沒有手冊頁)。這如何用於遞歸檢查和轉換編碼?請確認/更正我提出的解決方案或提供完整的解決方案。
這裡有很多問題合二為一。
首先,當使用 find 時,我總是使用
--exec
而不是xargs
. 作為一般規則,最好用盡可能少的命令來做事。但前兩種方法也將所有文件名寫入文本流,以便 xargs 重新解釋回文件名。這是一個不必要的步驟,只會增加(當然很小)失敗的機會。
dos2unix
將接受多個文件名,所以我會使用:find . -type f -exec dos2unix --keepdate {} +
這將堆積一長串文件,然後
dos2unix
立即開始處理一大堆文件。要找出哪些文件將被觸摸,只需刪除 exec 子句:
find . -type f
編碼變化的問題要大得多。請注意,沒有辦法可靠地確定任何文本文件的目前編碼。有時可以猜到,但這絕不是 100% 可靠的。因此,如果您確定所有文件目前都是相同的編碼,則只能批處理編碼。
我建議使用
iconv
. 這確實是這項工作的預設設置。你可以在這裡找到它的手冊頁:https://linux.die.net/man/1/iconv
這裡有一個如何使用
iconv
with的工作範例find
:https://stackoverflow.com/questions/4544669/batch-convert-latin-1-files-to-utf-8-using-iconv