Unix の行末を持つはずのファイルがたくさん (数百) あります。それらのいくつかには Windows の行末があるのではないかと強く疑っています。
私はただ走ることができることを知っています
フリップ-uまたはスクリプトですべてを変換するのと同様のものですが、最初に変更する必要があるファイルを識別できるようにしたいと考えています。
Unix の行末を持つはずのファイルがたくさん (数百) あります。それらのいくつかには Windows の行末があるのではないかと強く疑っています。
私はただ走ることができることを知っています
フリップ-uまたはスクリプトですべてを変換するのと同様のものですが、最初に変更する必要があるファイルを識別できるようにしたいと考えています。
ツールを使用するfile
と、行末のタイプがわかります。dos2unix -U
または、それが何から始まったかに関係なく、すべてを Unix の行末に変換する which を使用することもできます。
grepを使用できます
egrep -l $'\r'\$ *
次のようなもの:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
ただし、その正規表現の一部は、改良と整理が必要な場合があります。
これにより、各行の末尾に WIN、MAC、または UNIX を含むファイルが出力されます。あなたのファイルがどういうわけかひどい混乱(または差分)であり、エンディングが混在している場合は良い.
これが最もフェイルセーフな答えです。Stimms の回答では、サブディレクトリとバイナリ ファイルが考慮されていません
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
file
ファイルの種類を検索するために使用します。CRLF を持つものには、ウィンドウの戻り文字があります。の出力はfile
で区切られ:
、最初のフィールドはファイルのパスです。Unix は 1 バイトの 0x0A (LineFeed) を使用しますが、Windows は 2 バイトの 0x0D 0x0A (キャリッジ リターン、ライン フィード) を使用します。
0x0D が表示されない場合は、Unix である可能性が非常に高くなります。0x0D 0x0A のペアが表示される場合は、MSDOS である可能性が非常に高くなります。
Windows の行末 (0x0D 0x0A
または\r \n
) を持つファイルがわかったら、そのファイルをどうしますか? それらを Unix の行末 (0x0A
または\n
) に変換すると思います。sed
次のコマンドを使用するだけで、ユーティリティを使用して、Windows の行末を含むファイルを Unix の行末に変換できます。
$> sed -i 's/\r//' my_file_with_win_line_endings.txt
次のようにスクリプトに入れることができます。
#!/bin/bash
function travers()
{
for file in $(ls); do
if [ -f "${file}" ]; then
sed -i 's/\r//' "${file}"
elif [ -d "${file}" ]; then
cd "${file}"
travers
cd ..
fi
done
}
travers
ファイルを含むルートディレクトリから実行すると、最終的にすべてのファイルが Unix 行末であることが確認されます。
Windowsは行末にchar 13と10を使用し、unixはそのうちの1つだけを使用します(どれを覚えていませんか)。したがって、 char 13 & 10 を char 13 または 10 ( unix を使用するもの) に置き換えることができます。