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

Min*_*ius 4 regex linux bash find gnu-findutils

关于正确处理包含换行符等奇怪符号的文件名有很多说法。我认为使用 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 中使用和类似的功能吗?

anu*_*ava 6

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

find . -name '*
*'
Run Code Online (Sandbox Code Playgroud)

其中单引号中嵌入了文字换行符。bash支持附加语法来指定换行符:

find . -name \*$'\n'\*
Run Code Online (Sandbox Code Playgroud)

或者稍微不那么笨拙:

EOL=$'\n'
find . -name "*$EOL*"
Run Code Online (Sandbox Code Playgroud)

或者使用-regex

find . -regex ".*$EOL.*"
Run Code Online (Sandbox Code Playgroud)

  • +1 我添加了一个 POSIX 兼容版本,因为似乎不值得为如此微小的差异添加竞争答案。 (3认同)