我需要定期运行一个命令来确保某些文本文件以 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