如何在不修改文件的情况下测试文件是否使用CRLF或LF?

如何在不修改文件的情况下测试文件是否使用CRLF或LF?

我需要定期运行一个命令来确保某些文本文件以 Linux 模式保存。不幸的是,dos2unix总是修改文件,这会弄乱文件和文件夹的时间戳并导致不必要的写入。

我编写的脚本是用 Bash 编写的,因此我更喜欢基于 Bash 的答案。

答案1

注意:这不应该在自动化脚本中使用,只是为了快速检查。对于自动化脚本,我建议您查看其他答案

使用cat -A

$ cat file
hello
hello

现在,如果这个文件是在 *NIX 系统中创建的,它将显示

$ cat -A file
hello$
hello$

但如果这个文件是在Windows中制作的,它会显示

$ cat -A file
hello^M$
hello

^M代表CR$代表LF.

我在Windows中使用Windows记事本,在Linux中使用Vim。请注意,Windows 记事本没有保存最后一行CRLF

这也不会更改文件内容。

答案2

您可以用作dos2unix过滤器并将其输出与原始文件进行比较:

dos2unix < myfile.txt | cmp - myfile.txt

答案3

如果目标只是避免影响时间戳,则dos2unix有一个-k--keepdate选项可以保持时间戳相同。它仍然需要执行写入操作来创建临时文件并重命名它,但您的时间戳不会受到影响。

如果对文件的任何修改是不可接受的,您可以使用以下解决方案这个答案

find . -not -type d -exec file "{}" ";" | grep CRLF

如果检测到此类线路终止,该file命令将输出。CRLF

答案4

您可以尝试grep使用 CRLF 代码,八进制:

grep -U $'\015' myfile.txt

或十六进制:

grep -U $'\x0D' myfile.txt

相关内容