有很多关于正确处理文件名的说法 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 find 文档没有说明任何关于支持转义字符(如 \n
)的信息。它们真的不受支持所以我们不能在查找正则表达式中使用 \t\n\r\a
和类似的东西吗?
最佳答案
要查找所有包含换行符的文件和目录,您可以使用此 POSIX 兼容调用来查找
:
find . -name '*
*'
其中单引号中嵌入了文字换行符。 bash
支持额外的语法来指定换行符:
find . -name \*$'\n'\*
或者不那么笨拙:
EOL=$'\n'
find . -name "*$EOL*"
或者使用-regex
:
find . -regex ".*$EOL.*"
关于regex - 如何查找名称中包含换行符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726862/