Чи є спосіб швидкої ідентифікації файлів із завершенням рядка 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 є три рядки, але немає CR, тому всі закінчення рядків повинні бути сольними LF у стилі Unix.

Файл f2 має рівну кількість рядків та CR, тому доцільно здогадатися, що він використовує закінчення рядків CR, LF, як використовуються MSDOS та Windows.


1
fileне виводить закінчення рядка стану , якщо він може знайти більш точну відповідність , ніж ASCII, тобто setup.py: a python script text executable. Здається, не можна знайти прапор, щоб змінити таку поведінку.
miracle2k

1
@ miracle2k: Можливо, для цього можна створити спеціальний магічний файл. file -m magicfile f1 f2 f3
RedGrittyBrick

1

У Windows швидкий спосіб сказати - відкрити файл у Блокноті. Блокнот показуватиме розриви рядків лише на завершеннях стилю 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

Зауважте, що для швидкості враховуються лише окремі \rs та \ns, але це був би досить хиткий файл, який мав однакову кількість обох типів і ще не був файлом Windows CRLF ...

Також зауважте, що інструмент * nix fileне здійснює повного сканування файлу, тоді як цей perlсценарій це робить. Ви не згадали, на якій платформі хочете, щоб вона працювала; Я використовував bashскрипт, щоб перевірити вихід Perl, але це можна змінити на cmdсценарій Window .

Ви можете просто передати файл на нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.