考虑以下目录结构:
$ find m
m
m/f.sh
m/.a
我想使用以下命令在非隐藏目录中查找隐藏文件:
find . -not -path "*/.*" -and -name "*.*"
.
./m/f.sh
但只f.sh
找到了 ,而我期望也能找到.a
。当搜索不包含-not -path
part 时,会找到所有隐藏文件:
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
工作。