关于正确处理包含换行符等奇怪符号的文件名有很多说法。我认为使用 IFS 设置为换行符通常可以解决问题,但显然,如果名称中包含换行符,则情况除外。因此,作为一种防御手段,脚本可以首先检查子树是否至少有一个带有换行符的文件,然后停止并显示一条消息以首先修复名称。令人惊讶的是我无法find用火柴做到这一点-regex。成功的唯一途径是相当丑陋
find . -name "*"$'\n'"*"
Run Code Online (Sandbox Code Playgroud)
但例如find . -regex ".*\n.*"不起作用。Emacs 正则表达式应该允许像 \n 这样的转义字符,不是吗?n有趣的是,它与名称中带有字符的另一个文件相匹配。尝试了不同的 -regextypes 只是发现类型awk sed posix-extended和更多类型将文件与换行符匹配(比方说a\nxxx),但此外它们也会将文件与字符匹配n。诡异的。另一方面,GNU find 文档没有说明任何有关转义字符(如\n. 它们真的不受支持,因此我们无法\t \n \r \a在 find regexps 中使用和类似的功能吗?