回答:
を含むいくつかの専用プログラムがあります
適切な方向のツールを選択し、コマンドラインで変換するファイルの名前を渡すだけです。
どちらも持っていないが、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
' _ {} +