尝试file,然后是file -k,然后是dos2unix -ih
file 通常就足够了。但对于棘手的情况,请尝试 file -k 或 dosunix -ih。
详情如下。
试试file -k
短版:file -k somefile.txt会告诉你。
- 它将为 DOS/Windows 行结尾输出
with CRLF line endings。
- 它将为 MAC 行结尾输出
with CR line endings。
- 对于 Linux/Unix 行“LF”,它只会输出
text。 (因此,如果它没有明确提及任何类型的 line endings,那么这隐含的意思是:“LF 行结尾”。)
长版见下文。
现实世界的例子:证书编码
我有时必须检查 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
嗯。它没有告诉我行尾。我已经知道那些是证书文件。我不需要“文件”来告诉我。
你还能尝试什么?
您可以尝试使用 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
所以这告诉你:是的,“0.example.end.cer”一定是个奇怪的人。但是有什么样的行尾呢? 你是否熟悉 dos2unix 输出格式? (我没有。)
但幸运的是file中有--keep-going(或简称-k)选项:
$ 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
太棒了!现在我们知道我们的奇数文件有 DOS (CRLF) 行结尾。 (并且其他文件具有 Unix (LF) 行结尾。这在此输出中并不明确。它是隐含的。这正是 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
我在写上面的例子时并不知道这一点,但是:
事实上,如果你像这样使用-ih(--info=h 的缩写),dos2unix 会给你一个标题行:
$ 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 的字母顺序。
进一步阅读