0

这有点复杂,但我想使用 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 脚本自己进行递归,但这对于大型目录树来说并不是最有效的方法。

4

1 回答 1

1

我认为这可以满足您的要求:

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

你的一些变化

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