【问题标题】:Prevent unix find descending into unmatched directories防止 unix find 下降到不匹配的目录
【发布时间】:2013-04-24 22:24:47
【问题描述】:

这有点复杂,但我想使用 find 命令搜索项目(文件、目录等)并运行命令以确定是否通过 -exec 参数包含它们,但是,我需要防止 find 下降到已排除的目录中。

例如:

find . -exec sh -c 'echo "{}" | grep -i ".*/[a][^/]*"' \;

有点奇怪的例子,但基本上上面应该只匹配以字母 a 开头的项目,但是如果你运行它,那么即使它不匹配以其他字母开头的目录,find 仍然会下降到它们如果该目录包含以字母 a 开头的项目,则返回结果。例如,它将匹配以下内容:

./aFolder/aFile
./Foo/Bar/aFile
./aFolder/Foo/Bar/aFile

我想做的是防止这种情况发生,这样如果一个目录不匹配,那么它的内容也会被忽略,在最后一个例子中,./aFolder 将被匹配,但是当 ./Foo 遇到搜索不应继续。

如果一个目录被排除在外,或者类似的命令可以以这种方式被限制,有没有办法防止 find 下降得更深?目前,我正在使用自定义 shell 脚本自己进行递归,但对于大型目录树来说,这并不是最有效的方法。

【问题讨论】:

    标签: shell find


    【解决方案1】:

    我认为这是你想要的:

    find . \( -name . -or -exec sh -c 'echo "{}" | grep -iq "^.*/[a][^/]*\$"' \; -or \( -prune -false \) \) -print
    

    与你的一些变化

    • 将 -q 添加到 grep 并将 -print 添加到 find 以确保输出与 find 匹配
    • 将 ^ 和 $ 添加到正则表达式以确保检查整个文件名
    • 添加 -or (-prune -false) 以确保不匹配的项目不会下降或匹配(-prune 单独为真)
    • 最后,添加 -name 。否则顶级目录将失败,因此,正确地,不会返回任何内容

    【讨论】:

    • 嗯,我不确定这是否按预期工作,因为它似乎仍会下降到目录中。这是我正在运行的确切命令:find . \( -exec sh -c '[ $(stat -qf "%i" "'"$PREVIOUS"'/{}") != $(stat -qf "%i" "'"$TARGET"'/{}") ]; exit $?' \; -or \( -prune -false \) \) -print。基本上它正在检查当前文件的 inode 是否与前一个目录中的不同,但它仍然下降。
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 2021-06-24
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多