关于正确处理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
和类似的东西吗?
答案 0 :(得分:3)
要查找包含新行的所有文件和目录,您可以使用此POSIX兼容调用find
:
find . -name '*
*'
其中文字换行符嵌入单引号中。 bash
支持指定换行符的其他语法:
find . -name \*$'\n'\*
或者不那么笨拙:
EOL=$'\n'
find . -name "*$EOL*"
或使用-regex
:
find . -regex ".*$EOL.*"