UnixとWindows改行形式の間のファイルシステムブランチのすべてのファイルを一括変換するには?

UnixとWindows改行形式の間のファイルシステムブランチのすべてのファイルを一括変換するには?

誰もが知っています:-) Windowsプレーンテキストファイルでは、行はCR + LFで終わりますが、Unix&LinuxではLFで終わります。すべてのソースコードファイルをある形式から別の形式にすばやく変換するには?

答え1

状況によって異なります。ファイルがバージョン管理対象である場合、これは記録汚染の決定で人気がない可能性があります。 Gitには、チェックアウト時に自動的に行末を変換するオプションがあります。

気にせずに高速変換をしたい場合は、fromdos/todosdos2unix/などのプログラムを使用してunix2dos実行できます。あなたはそれを使用することができますfindfind . -type f -name '*.php' -exec dos2unix '{}' +

答え2

次のようなさまざまなプロのプログラムがあります。

適切な方向のツールを選択し、コマンドラインから変換したいファイル名を渡すだけです。


LinuxまたはCygwin以外に両方がない場合:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

パールがある場合:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

BusyBoxを含むPOSIXツールのみを使用してunixからdosに移動するには、sedコマンドに文字通りCR文字を渡す必要があります。

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

一方、すべてのCRを簡単に削除することもできます。

tr -d '\r' <filename >filename.dos
mv filename.dos filename

ワイルドカードを使用して、同じディレクトリにある複数のファイルを一度に変換できます。

sed -i -e 's/\r\+$//' *.txt

現在のディレクトリとそのサブディレクトリのすべてのファイルを変換するには、シェルがzshの場合は次のようになります**/

sed -i -e 's/\r\+$//' **/*.txt

bash ≥4で使用できますが、最初に実行する必要があります**/(この行をに入れることができます)。 ksh93で使用できますが、最初に実行する必要があります(この行を 。shopt -s globstar~/.bashrc**/set -o globstar~/.kshrc

リダイレクトが必要なツールのみが利用可能な場合は、ループを使用してくださいfor

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

変換するファイルを選択するためのより複雑な一致がない場合、または必要な場合は、**/このfindコマンドを使用してください。これは、名前付きファイル.oと名前付きサブディレクトリにあるファイルを除いて、現在のディレクトリとそのサブディレクトリにあるすべてのファイルを再帰的に変換するLinux / Cygwinの例ですbin

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

これはPOSIXの例です。find必要なリダイレクトを実行できるシェルを起動するように指示します。

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

findシェルコマンド内でループを使用すると、この方法を少し高速化できますが、コードがより複雑になります。

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +

答え3

ウィンスプ次のような場合でも自動的に変換されます。だから言った

ファイルがすべて同じディレクトリにある場合:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

答え4

次から変更CRLF行終端を持つASCIIテキスト到着ASCIIテキスト

VIM - Vi 改善された8.0(2016年9月12日、2018年4月10日21:31:58で編集)


現在のディレクトリ内のすべてのファイル

for i in *; do vi -c "set fileformat=unix | wq" "${i}"; done

特定のマスク(現在のディレクトリで「file」という単語で始まるすべてのファイル名)

for i in file*; do vi -c "set fileformat=unix | wq" "${i}"; done

別のマスク(「file」という単語を含む現在のディレクトリのすべてのファイル名)

for i in *file*; do vi -c "set fileformat=unix | wq" "${i}"; done

ファイルをCRLFに変換するには、fileformat = unixをfileformat = dosに変更するだけです。

for i in *file*; do vi -c "set fileformat=dos | wq" "${i}"; done

これはvimを使用してファイル形式を変換する最速の方法です。


または、sedを使用してCTRL + Vを押してから、CTRL + Mを押してすべての^ Mを削除することもできます。

for i in *; do sed -i s/^M// "$i"; done

または

for i in *; do sed -i s/^M// "${i}"; done

また、現在のディレクトリのすべてのCRLFファイルがASCIIテキストに変更されます。

関連情報