質問

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 の行末を持つことが確認されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top