Есть ли способ быстро идентифицировать файлы с помощью терминальной строки 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 и является символом возврата каретки (CR) ASCII.

Здесь мы видим, что файл f1 имеет три строки, но не содержит CR, поэтому все окончания строк должны быть одиночными LF в стиле Unix.

Файл f2 имеет одинаковое количество строк и CR, поэтому разумно предположить, что он использует окончания строк CR, LF, используемые в MSDOS и Windows.

RedGrittyBrick
источник
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, но это был бы довольно дурацкий файл, который имел бы одинаковое количество обоих типов и все же не был файлом CRLF для Windows ...

Также обратите внимание, что инструмент * nix fileне выполняет полное сканирование файла, в то время как этот perlскрипт делает. Вы не упомянули, на какой платформе вы хотите, чтобы она работала; Я использовал bashскрипт для проверки вывода perl, но его можно изменить на cmdскрипт Windows .

Вы можете просто передать свой файл к нему.

Peter.O
источник