查找至少包含一个CR LF的文件。

5
我在使用Linux。我收到了一个混合的文件列表,但我事先忘记验证它们。我的编辑器(emacs)已经在一些原本是CR+LF(\r\n)的文件中使用了LF(\n)!!我意识到这太晚了,我认为这正引起了问题。
我想查找当前工作目录中至少有一个CR+LF的所有文件。我不信任file命令,因为我认为它只检查前几行而非整个文件。
我想检查整个文件以查找CR+LF。是否有此类工具,或者我需要自己编写?
2个回答

6
您可以使用这个grep命令列出目录中至少有一个CR-LF的所有文件:
grep -l $'\r$' *

模式$'\r$'会在每行末尾刚好之前插入\r

或者使用十六进制值:

grep -l $'\x0D$' *

\x0D 会寻找 \r(ASCII:13)。


我认为在某些环境下这个不起作用,例如在Windows上使用Git Bash附带的版本的grep时。但是在期望换行符为\n的环境中应该可以工作。 - Tom Fenech
正确,但是OP使用的是Linux操作系统(根据标签)。 - anubhava
@jeckyll2hide: $'..' 被称为转义序列。该单词会扩展成一个字符串,其中反斜杠转义的字符会按照 ANSI C 标准所指定的方式被替换。 - anubhava
1
是的,没错,我当时在执行 grep -r 命令,结果它找到了很多二进制文件(我的错误)。 - blueFast
1
“grep”是随Git Bash一起安装的,但它不能在Git Bash中使用,只能在WSL中使用。 - Evgeniy Chekushkin
显示剩余3条评论

0
dos2unix 不仅可以将 DOS 的换行符(CR+LF)转换为 Unix 换行符(LF),还可以通过 -i 选项显示文件信息。例如:
sh-4.3$ (echo "1" ; echo "") > 123.txt 
sh-4.3$ unix2dos 123.txt 
unix2dos: converting file 123.txt to DOS format...
sh-4.3$ cat 123.txt ; hexdump -C 123.txt ; dos2unix --info='du' 123.txt
1

00000000  31 0d 0a 0d 0a                                    |1....|
00000005
       2       0  123.txt
sh-4.3$ dos2unix 123.txt 
dos2unix: converting file 123.txt to Unix format...
sh-4.3$ cat 123.txt ; hexdump -C 123.txt ; dos2unix --info='du' 123.txt
1

00000000  31 0a 0a                                          |1..|
00000003
       0       2  123.txt

当您使用“c”标志时,它甚至更简单。要列出所有具有DOS换行符的文件:dos2unix -ic *列出所有具有Unix换行符的文件:unix2dos -ic * - Erwin Waterlander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接