誰もが知っています:-) Windowsプレーンテキストファイルでは、行はCR + LFで終わりますが、Unix&LinuxではLFで終わります。すべてのソースコードファイルをある形式から別の形式にすばやく変換するには?
答え1
状況によって異なります。ファイルがバージョン管理対象である場合、これは記録汚染の決定で人気がない可能性があります。 Gitには、チェックアウト時に自動的に行末を変換するオプションがあります。
気にせずに高速変換をしたい場合は、fromdos
/todos
やdos2unix
/などのプログラムを使用してunix2dos
実行できます。あなたはそれを使用することができますfind
:find . -type f -name '*.php' -exec dos2unix '{}' +
。
答え2
次のようなさまざまなプロのプログラムがあります。
dos2unix
そしてunix2dos
からDOS 2 Unixツールtodos
そしてfromdos
からトプロドスツール
適切な方向のツールを選択し、コマンドラインから変換したいファイル名を渡すだけです。
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