Files

遞歸地將 Windows 文件轉換為 Unix 文件

  • March 16, 2019

我有一個 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

這裡有一個如何使用iconvwith的工作範例find

https://stackoverflow.com/questions/4544669/batch-convert-latin-1-files-to-utf-8-using-iconv

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