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 中使用和类似的功能吗?
要查找所有包含换行符的文件和目录,您可以使用以下 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)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |