Спробуйте file
потім file -k
потімdos2unix -ih
file
зазвичай буде достатньо Але для важких випадків спробуйте file -k
або dosunix -ih
.
Деталі нижче.
Спробуйте file -k
Коротка версія: file -k somefile.txt
скажу.
- Він виведе
with CRLF line endings
для закінчень рядків DOS / Windows.
- Він виведе
with LF line endings
для закінчень рядків MAC.
- А для Linux / Unix рядка "CR" це буде просто вихід
text
. (Тож якщо в ньому прямо не згадується жоден вид, line endings
то це неявно означає: "Кінцеві рядки закінчення" .)
Довгу версію дивіться нижче.
Приклад реального світу: кодування сертифікатів
Мені іноді доводиться перевіряти це на наявність файлів сертифікатів PEM.
Проблема з регулярними file
полягає в наступному: іноді вони намагаються бути занадто розумними / занадто конкретними.
Спробуємо невелику вікторину: у мене є кілька файлів. І один з цих файлів має різні закінчення рядків. Який?
(До речі: саме так виглядає один із моїх типових каталогів "робота з сертифікатами".)
Спробуємо регулярно file
:
$ file -- *
0.example.end.cer: PEM certificate
0.example.end.key: PEM RSA private key
1.example.int.cer: PEM certificate
2.example.root.cer: PEM certificate
example.opensslconfig.ini: ASCII text
example.req: PEM certificate request
Ага. Це не говорить мені закінчення рядка. І я вже знав, що це файли cert. Мені не потрібно було "файлу", щоб мені це сказати.
Що ще можна спробувати?
Ви можете спробувати dos2unix
з таким --info
перемикачем:
$ dos2unix --info -- *
37 0 0 no_bom text 0.example.end.cer
0 27 0 no_bom text 0.example.end.key
0 28 0 no_bom text 1.example.int.cer
0 25 0 no_bom text 2.example.root.cer
0 35 0 no_bom text example.opensslconfig.ini
0 19 0 no_bom text example.req
Отже, це говорить вам про те, що: yup, "0.example.end.cer" повинен бути дивним чоловіком. Але які закінчення рядків існують? Чи знаєте ви напам’ять вихідний формат dos2unix? (Я не.)
Але на щастя, є --keep-going
(або -k
на короткий час) варіант у file
:
$ file --keep-going -- *
0.example.end.cer: PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key: PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer: PEM certificate\012- , ASCII text\012- data
2.example.root.cer: PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req: PEM certificate request\012- , ASCII text\012- data
Відмінно! Тепер ми знаємо, що наш непарний файл має CRLF
закінчення рядка DOS ( ). (І інші файли мають LF
закінчення рядків Unix ( ). Це не явно в цьому висновку. Це неявно. Це просто спосіб file
очікування "звичайного" текстового файлу.)
(Якщо ви хочете поділитися моєю мнемонічністю: "L" - це "Linux" і "LF".)
Тепер давайте перетворимо винуватця і повторимо спробу:
$ dos2unix -- 0.example.end.cer
$ file --keep-going -- *
0.example.end.cer: PEM certificate\012- , ASCII text\012- data
0.example.end.key: PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer: PEM certificate\012- , ASCII text\012- data
2.example.root.cer: PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req: PEM certificate request\012- , ASCII text\012- data
Добре. Тепер усі серти мають закінчення Unix.
Спробуйте dos2unix -ih
Я не знав цього, коли писав приклад вище, але:
Насправді виявляється, що dos2unix дасть вам заголовок, якщо ви використовуєте -ih
(короткий для --info=h
) такий:
$ dos2unix -ih -- *
DOS UNIX MAC BOM TXTBIN FILE
0 37 0 no_bom text 0.example.end.cer
0 27 0 no_bom text 0.example.end.key
0 28 0 no_bom text 1.example.int.cer
0 25 0 no_bom text 2.example.root.cer
0 35 0 no_bom text example.opensslconfig.ini
0 19 0 no_bom text example.req
І ще один "фактично" момент: Формат заголовка запам'ятовується дуже просто: Ось дві мнемоніки:
- Це DUMB (зліва направо: d для Dos, u для Unix, m для Mac, b для BOM).
- А також: "DUM" - це лише алфавітне впорядкування D, U та M.
Подальше читання
man less
.