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


14

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

回答:


17

それは、ファイルがバージョン管理下にある場合、これはかなり人気のない履歴汚染の決定になる可能性があります。Gitには、チェックアウト時に自動的に行末を変換するオプションがあります。

気にせず、すぐに変換したい場合は、fromdos/ todosdos2unix/のようなプログラムがありunix2dosます。以下を使用できますfindfind . -type f -name '*.php' -exec dos2unix '{}' +


7

を含むいくつかの専用プログラムがあります

  • dos2unixおよびdos2unixツールunix2dosから
  • todos以下とfromdosからtofrodosのツール

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


どちらも持っていないが、LinuxまたはCygwinを持っている場合:

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

perlがある場合:

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

POSIXツール(BusyBoxを含む)のみで、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で使用できますが、shopt -s globstar最初に実行する必要があります(この行をに入れることができます~/.bashrc)。**/ksh93で使用できますが、set -o globstar最初に実行する必要があります(この行をに入れることができます~/.kshrc

リダイレクトが必要なツールしか使用できない場合は、forループを使用します。

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

**/変換するファイルを選択するためのより複雑なマッチングがない場合、または必要ない場合は、findコマンドを使用します。以下に、Linux / Cygwinの例を示します。この例では、現在のディレクトリとそのサブディレクトリの下にあるすべてのファイルを、と呼ばれる.oサブディレクトリと呼ばれるファイルを除いて再帰的に変換します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
' _ {} +

2

WinSCPのはあれば、また、自動変換されますので語りました

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

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

WinSCPで達成する方法についてもう少し説明していただけますか?
harishシャルマ

@harishsharma「教えて」というリンクを追加しました。
Nils
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.