2013-04-30 147 views
0

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

例如:

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

位一个奇怪的例子,但基本上上面应该只匹配以字母开始一个项目,但是如果你运行它,那么即使它不符合目录,从其他字母开始,如果该目录包含以字母a开头的项目,find将仍然会进入它们并返回结果。例如,它会匹配以下内容:

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

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

如果一个目录被排除在外,还是有类似的命令可以用这种方式进行限制,有没有一种方法可以防止找到更深的下降?目前,我正在使用自定义shell脚本来自己完成递归,但它并不是实现大型目录树最有效的方法。

回答

1

我觉得这你想要做什么:

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

一些变化,从你的

  • -q添加到grep和-print来查找,以确保输出匹配什么查找
  • 将^和$加到正则表达式中以确保检查整个文件名
  • 添加-or(-prune -false)以确保不匹配的项目不会下降到或匹配(仅单独使用Prune)
  • 最后,添加-name。否则顶级目录将失败,所以,正确的,没有什么会返回
+0

嗯,我不知道这是工作正常,因为它似乎仍然下降到目录。下面是我正在运行的确切命令:'find。 \(-exec sh -c'[$(stat -qf“%i”“'”$ PREVIOUS“'/ {}”)!= $(stat -qf“%i”“'”$ TARGET“'/ }“)];退出$?'\; - 或者(--prune -false \)\)-print'。基本上它是检查当前文件的inode是否与先前目录中的inode不同,但它仍然下降。 – Haravikk 2013-05-01 14:59:58