从查找结果中排除隐藏目录中的文件,但不排除隐藏文件(在非隐藏目录下)

从查找结果中排除隐藏目录中的文件,但不排除隐藏文件(在非隐藏目录下)

给定以下目录结构:

$ tree --noreport dir

dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
|   ├── .hiddenfileB
│   ├── fileC
│   └── fileD
└── dirA
    ├── .hiddenfileC
    ├── fileE
    └── fileF

要求是调用 find ,以便从结果中排除隐藏目录中的文件,但不包括隐藏文件(在非隐藏目录下)。

预期回报应该类似于:

./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA

做了一些研究并发现这里信息使我创建了以下调用find

$ find . -type f -not -path '*/\.*' -print

但这个解决方案有一个缺点,就是跳过隐藏目录和文件

答案1

修剪隐藏目录并将结果限制为文件:

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

正如建议的杰蒂尔,您可能更喜欢过滤掉目录,这将导致显示文件、链接等:

find . -type d -name '.?*' -prune -o ! -type d -print

答案2

您所拥有的命令非常接近工作。使用

find . -type f ! -path '*/.*/*' -print
  • 路径模式*/.*/*寻找 a /. (表示以.已关注(最终)经过a  / — 因此段名称以. 不能是最后一个(文件名);即,它必须是目录名称。
  • -path使用文件名扩展模式;又名通配符或通配符。所以你不需要放在\前面 .
  • -not如果您想要移植到非 GNU 系统,请不要使用。使用 来 ! 表示“不”是由 POSIX 指定的,并且适用于每个版本find (甚至是 BSD、Solaris 等以及古老的系统)。

相关内容