Unixの行末を持っているはずのファイルがたくさんあります。私は、それらのいくつかがWindowsの行末を持っていることを強く疑っています。
私はただ走ることができることを知っています
フリップ-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を使用する場合、ウィンドウは文字を返します。 file
の出力は:
で区切られ、最初のフィールドはファイルのパスです。Unixは1バイトの0x0A(LineFeed)を使用し、Windowsは2バイトの0x0D 0x0A(復帰、改行)を使用します。
0x0Dが表示されない場合は、Unixである可能性が非常に高いです。 0x0D 0x0Aペアが表示される場合、MSDOSである可能性が非常に高くなります。
Windowsは行末にchar 13と10を使用し、そのうちの1つだけをunixします(どちらを覚えていないのか)。したがって、char 13と10をchar 13または10(unixを使用するもの)に置き換えることができます。
どのファイルが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の行末であることが確実になります。