【问题标题】:How to find files containing newlines in their names如何查找名称中包含换行符的文件
【发布时间】:2014-03-10 17:10:04
【问题描述】:

关于文件名的正确处理,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 和类似的吗?

【问题讨论】:

    标签: regex linux bash find gnu-findutils


    【解决方案1】:

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

    find . -name '*
    *'
    

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

    find . -name \*$'\n'\*
    

    或者不那么笨拙:

    EOL=$'\n'
    find . -name "*$EOL*"
    

    或者使用-regex:

    find . -regex ".*$EOL.*"
    

    【讨论】:

    • 确实可以。但是 find -regex test 会有类似的事情吗?到目前为止似乎还没有,但无论如何谢谢。
    • +1 我添加了一个与 POSIX 兼容的版本,因为它似乎不值得为这么小的差异添加一个竞争答案。
    • @chepner: 非常感谢我的朋友 :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2017-01-17
    • 2012-07-04
    • 2020-08-03
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多