WindowsファイルをUnixファイルに再帰的に変換する

WindowsファイルをUnixファイルに再帰的に変換する

Linuxには、複数のディレクトリ(およびサブディレクトリ)と多くのPHP、JS、HTML、CSSなどのファイルを含むPHPアプリケーションがあります。多くのファイルに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おすすめですiconvfile適用もそうです。繰り返しますが、どちら(または他のもの)を使用する必要がありますか?インストールencaして実行したときにenca --list languages複数の言語がリストされていますが、英語は表示されませんでした(「なし」が選択されている可能性があります)。私の質問は適用可能です。 iconvすでにインストールされていますが、マニュアルページはありません(少なくともman iconv)。これをどのように使用してエンコードを再帰的に確認して変換できますか?

私が提案したソリューションを確認/修正するか、完全なソリューションを提供してください。

ベストアンサー1

多くの質問がここに一つに統合されました。

まず、findを使用するとき、私はいつも代わりに--exec使用しますxargs。通常、操作を実行するには、できるだけ少ないコマンドを使用するのが最善です。そして、最初の2つの方法は、xargsがファイル名として再解釈できるように、すべてのファイル名をテキストストリームに書き込みます。これは(確かに小さい)失敗する可能性。

dos2unix複数のファイル名を受け入れるので、次を使用します。

find . -type f -exec dos2unix --keepdate {} +

これにより、長いファイルのリストが作成され、dos2unix一度に複数のファイルが開始されます。


どのファイルがタッチされているかを確認するには、exec句を削除します。

find . -type f

コーディングの変更ははるかに大きな問題です。テキストファイルの現在のエンコーディングは確実に確認できません。時には推測が可能ですが、決して100%信頼できません。したがって、現在すべてのファイルが同じエンコーディングになっていると確信している場合にのみ、エンコーディングをバッチ処理できます。

を使用することをお勧めしますiconv。これは実際にはこの操作のデフォルトでもあります。マンページはここにあります:

https://linux.die.net/man/1/iconv

以下は、次のようiconvに使用する方法の実際の例ですfind

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

おすすめ記事