質問
Unix の行末を持つはずのファイルが大量 (数百) あります。それらの一部には Windows の行末があるのではないかと強く疑っており、どれが Windows の行末であるかをプログラムで確認したいと考えています。
ただ走ればいいのは分かっている
flip -uまたは、スクリプト内で同様のことを実行してすべてを変換しますが、最初に変更する必要があるファイルを特定できるようにしたいと考えています。
解決
grepを使用できます
egrep -l $'\r'\$ *
他のヒント
使用できます file
ツールは、行末のタイプを教えてくれます。または、単に使用することもできます dos2unix -U
これにより、先頭が何であったかに関係なく、すべてが Unix の行末に変換されます。
次のようなもの:
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 を持つものは Windows が文字を返します。の出力file
で区切られています:
, 、最初のフィールドはファイルのパスです。
Unix は 1 バイト、0x0A (LineFeed) を使用しますが、Windows は 2 バイト、0x0D 0x0A (Carriage Return、Line Feed) を使用します。
0x0D が表示されない場合は、Unix である可能性が非常に高くなります。0x0D 0x0A ペアが表示される場合は、MSDOS である可能性が非常に高くなります。
Windows では行末に char 13 と 10 が使用されますが、UNIX ではそのうちの 1 つだけが使用されます (どれかは覚えていません)。したがって、 char 13 & 10 を char 13 または 10 ( unix を使用するもの) に置き換えることができます。
どのファイルに Windows の行末 (0x0D 0x0A
または \r \n
)、そのファイルをどうしますか?それらを Unix の行末に変換すると思います (0x0A
または \n
)。Windows の行末を持つファイルを Unix の行末に変換できます。 sed
ユーティリティでは、次のコマンドを使用するだけです。
$> 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 の行末を持つことが確認されます。