如何在名称中查找包含换行符的文件

时间:2014-02-12 11:37:38

标签: regex linux bash find gnu-findutils

关于正确处理contain weird symbols like newlines的文件名,有很多说法。我认为使用IFS设置为换行符一般可以解决问题,除非显而易见,如果其中有一个带有换行符的名称。因此,作为一种防御手段,可以首先检查子树是否至少有一个带换行符的文件,并停止并首先修复该名称的消息。 令人惊讶的是,我无法通过find匹配-regex进行此操作。唯一成功的方式是相当丑陋的

find . -name "*"$'\n'"*"

但是例如find . -regex ".*\n.*"不起作用。 Emacs正则表达式应该允许转义字符,如\ n,不应该吗?有趣的是,它匹配名称中包含字符n的另一个文件。使用不同的-regextypes进行实验只是为了找到类型awk sed posix-extended以及更多类型将文件与换行符匹配(比如说a\nxxx)但另外它们将匹配文件也有字符n。奇怪的。 另一方面,GNU查找文档没有说明对\n之类的转义字符的支持。他们真的不受支持,所以我们不能在查找正则表达式中使用\t \n \r \a和类似的东西吗?

1 个答案:

答案 0 :(得分:3)

要查找包含新行的所有文件和目录,您可以使用此POSIX兼容调用find

find . -name '*
*'

其中文字换行符嵌入单引号中。 bash支持指定换行符的其他语法:

find . -name \*$'\n'\*

或者不那么笨拙:

EOL=$'\n'
find . -name "*$EOL*"

或使用-regex

find . -regex ".*$EOL.*"