防止unix找到降级到不匹配的目录

时间:2013-04-30 21:38:00

标签: shell find

这有点复杂,但我想使用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时搜索不应继续进入。

如果排除某个目录,还是有一种方法可以阻止查找更深入地下降,或者是否可以以这种方式限制类似的命令?目前我正在使用自定义shell脚本自己进行递归,但对于大型目录树来说,这不是最有效的方法。

1 个答案:

答案 0 :(得分: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。否则顶级目录将失败,因此,正确地说,不会返回任何内容