在非隐藏目录中查找隐藏文件

在非隐藏目录中查找隐藏文件

考虑以下目录结构:

$ find m
m
m/f.sh
m/.a

我想使用以下命令在非隐藏目录中查找隐藏文件:

find . -not -path "*/.*" -and -name "*.*"
.
./m/f.sh

但只f.sh找到了 ,而我期望也能找到.a。当搜索不包含-not -pathpart 时,会找到所有隐藏文件:

find . -name "*.*"
./m/f.sh
./m/.a

我如何指定搜索非隐藏目录,但也匹配隐藏文件?

澄清:

  • ./non-hidden-dir/.hidden-dir/.hidden-file应该可以找到。
  • ./.hidden-dir/non-hidden-dir/.hidden-file不应该被找到。

答案1

关于您尝试过的操作:

  • -not -path "*/.*"对于任何包含 的路径名,结果都为 false /.。它将排除所有隐藏文件并删除所有隐藏子目录(不像-prune因为它们的内容将被测试,但测试结果始终为 false)。
  • -name "*.*"对于包含 的任何基本名称,计算结果为 true .,无论点出现在前面 ( .a) 还是其他地方 ( f.sh)。

看起来您想删除隐藏的顶级目录。您想在其他地方找到隐藏文件。因此,如下所示:

find . -path './.*' -prune -o -name '.*'

上述代码有效地将其.视为非隐藏的,并且它使用 POSIX 的“文件”定义意思是目录也是文件。如果您指的是“隐藏的常规文件”,那么代码应该是:

find . -type d -path './.*' -prune -o -type f -name '.*' -print

笔记:

  • -not您使用的和-and是不可移植的;可移植的等效物分别是!-a(并且您可以或可以省略-a)。
  • 我的这个答案可能有助于了解如何find工作。

相关内容