12

Cygwin の UNIX 貼り付けユーティリティを使用して貼り付ける必要がある数百 GB のデータがありますが、ファイルに Windows EOL 文字があると正しく機能しません。データには Windows の EOL 文字が含まれている場合と含まれていない場合があり、必要がなければ dos2unix の実行に時間を費やしたくありません。

私の質問は、Cygwin で、これらのファイルに Windows EOL CRLF 文字が含まれているかどうかをどのように判断できますか?

テストデータを作成して実行してみました

sed -r 's/\r\n//' testdata.txt

しかし、dos2unix が実行されているかどうかに関係なく、一致するように見えます。

ありがとう。

4

8 に答える 8

21

file(1)ユーティリティは違いを認識しています:

$ file * | grep ASCII
2:                                       ASCII text
3:                                       ASCII English text
a:                                       ASCII C program text
blah:                                    ASCII Java program text
foo.js:                                  ASCII C++ program text
openssh_5.5p1-4ubuntu5.dsc:              ASCII text, with very long lines
windows:                                 ASCII text, with CRLF line terminators

file(1)できるだけ少ないファイルを読み取ろうとするように最適化されているため、CRLF ターミネータを見つけて修正するときに実行する必要があるディスク IO の量を大幅に削減できます。

CRLF の一部のケースはそのままにしておく必要があることに注意してください。SMTPのキャプチャでは CRLF が使用されます。しかし、それはあなた次第です。:)

于 2011-03-17T23:42:47.057 に答える
4
#!/bin/bash
for i in $(find . -type f); do
        if file $i | grep CRLF ; then
                echo $i
                file $i
                #dos2unix "$i"
        fi
done

それらを変換する準備ができたら、「#dos2unix "$i"」のコメントを外します。

于 2011-11-17T10:33:06.300 に答える
3

次を使用して確認できますfile

file /mnt/c/BOOT.INI 
/mnt/c/BOOT.INI: ASCII text, with CRLF line terminators

ここでは CRLF が重要な値です。

于 2011-03-17T23:44:23.380 に答える
2

ファイルパターンフィルターを使用したgrep再帰

grep -Pnr --include=*file.sh '\r$' .

出力ファイル名、行番号、行自体

./test/file.sh:2:here is windows line break
于 2015-10-22T13:04:44.873 に答える
1

dos2unix の -i オプションを使用すると、ファイルを変換せずに、DOS Unix Mac の改行 (この順序で)、BOM、およびテキスト/バイナリに関する情報を取得できます。

$ dos2unix -i *.txt
    6       0       0  no_bom    text    dos.txt
    0       6       0  no_bom    text    unix.txt
    0       0       6  no_bom    text    mac.txt
    6       6       6  no_bom    text    mixed.txt
   50       0       0  UTF-16LE  text    utf16le.txt
    0      50       0  no_bom    text    utf8unix.txt
   50       0       0  UTF-8     text    utf8dos.txt

「c」フラグを指定すると、dos2unix は変換されるファイルを報告します。iow ファイルには DOS 改行があります。DOS 改行を含むすべての txt ファイルを報告するには、次のようにします。

$ dos2unix -ic *.txt
dos.txt
mixed.txt
utf16le.txt
utf8dos.txt

これらのファイルのみを変換するには、次のようにします。

dos2unix -ic *.txt | xargs dos2unix

ディレクトリを再帰的に移動する必要がある場合は、次のようにします。

find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix

dos2unix の man ページも参照してください。

于 2015-10-23T07:06:42.927 に答える
1

file(1) コマンドを使用するためのヒントをありがとうございます。ただし、もう少し改良が必要です。プレーン テキスト ファイルだけでなく、一部の ".sh" スクリプトにも間違った eol が含まれているという状況がありました。そして、「ファイル」は、eol に関係なく、次のように報告します。

xxx/y/z.sh: application/x-shellscript

そのため、「file -e soft」オプションが必要でした (少なくとも Linux の場合):

bash$ find xxx -exec file -e soft {} \; | grep CRLF

これにより、ディレクトリ xxx およびサブディレクトリ内の DOS eol を持つすべてのファイルが検索されます。

于 2012-05-29T11:20:36.370 に答える
1

上記のように、「ファイル」ソリューションは機能します。次のコード スニペットが役立つかもしれません。

#!/bin/ksh
EOL_UNKNOWN="Unknown"       # Unknown EOL
EOL_MAC="Mac"               # File EOL Classic Apple Mac  (CR)
EOL_UNIX="Unix"             # File EOL UNIX               (LF)
EOL_WINDOWS="Windows"       # File EOL Windows            (CRLF)
SVN_PROPFILE="name-of-file" # Filename to check.
...

# Finds the EOL used in the requested File
# $1 Name of the file (requested filename)
# $r EOL_FILE set to enumerated EOL-values.
getEolFile() {
    EOL_FILE=$EOL_UNKNOWN

    # Check for EOL-windows
    EOL_CHECK=`file $1 | grep "ASCII text, with CRLF line terminators"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_WINDOWS
       return
    fi

    # Check for Classic Mac EOL
    EOL_CHECK=`file $1 | grep "ASCII text, with CR line terminators"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_MAC
       return
    fi

    # Check for Classic Mac EOL
    EOL_CHECK=`file $1 | grep "ASCII text"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_UNIX
       return
    fi

    return
   } # getFileEOL   
   ...

   # Using this snippet
   getEolFile $SVN_PROPFILE
   echo "Found EOL: $EOL_FILE"
   exit -1
于 2012-01-22T08:43:38.360 に答える