WindowsまたはUnixのラインターミネーションでファイルをすばやく識別する方法はありますか?


8

dos2unixを使用してWindowsとUnixの回線終端を変換できることはわかっています。ファイルにWindowsまたはUnixのラインターミネーションがあるかどうかを確認できるコマンドがあるかどうか疑問に思います。

回答:


11
$ file f1 f2 f3
f1: ASCII text, with CRLF, LF line terminators
f2: ASCII text, with CRLF line terminators
f3: ASCII text

ファイルのすべての行をチェックする必要があると思われる場合は、次のようにできます。

$ grep -c "^M" f1 f2
f1:0
f2:3

$ wc -l f1 f2
 3 f1
 3 f2
 6 total

「^ M」はCtrl + V Ctrl + Mを使用して入力されたもので、ASCII復帰(CR)文字です。

ここでは、ファイルf1に3行ありますがCRがないため、すべての行末はUnixスタイルのソロLFでなければなりません。

ファイルf2の行数とCRの数は同じであるため、MSDOSとWindowsで使用されているCR、LFの行末を使用していると推測するのが妥当です。


1
fileASCIIより近い一致が見つかると、行末ステータスを出力しませんsetup.py: a python script text executable。Aはその動作を変更するフラグを見つけることができないようです。
miracle2k 14年

1
@ miracle2k:おそらく、これを行うためのカスタムマジックファイルを作成できます。file -m magicfile f1 f2 f3
RedGrittyBrick 2014年

1

Windowsでは、メモ帳でファイルを開くと簡単にわかります。Notepadは、Windowsスタイルの終了(CR + LF)でのみ改行を表示し、UNIXの終了(LF)では表示しません。したがって、unixテキストは次のようになります。

Line1Line2Line3Line4

一方、Windowsのテキストは次のようになります。

line1
line2
line3
line4

私はunix / linuxプラットフォームにはあまり詳しくありませんが、geditやemacsなどのプログラムで同様のハックを使用できると確信しています。


0
c=($(perl -0777ne 'print $_ =~ tr/\n//; print " "; 
                   print $_ =~ tr/\r//;'))
if   ((!(c[0] +   c[1]))) ;then echo no line endings  
elif ((  c[0] && !c[1] )) ;then echo LF
elif (( !c[0] &&  c[1] )) ;then echo CR 
elif ((  c[0] ==  c[1] )) ;then echo CRLF 
else echo "anbigious LF ${c[0]} CR ${c[1]}"
fi

速度を上げるために、個々\rのとのみ\nがカウントされることに注意してください。これは、両方のタイプの数が同じで、しかもWindows CRLFファイルではないかなり奇抜なファイルです...

また、* nixツールfileはファイルの完全なスキャンを実行しませんが、このperlスクリプトはファイルを実行します。実行したいプラットフォームについては言及していません。bashスクリプトを使用してperlの出力をテストしましたが、ウィンドウcmdスクリプトに変更できます。

パイプでファイルを渡すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.