给定以下目录结构:
$ 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 等以及古老的系统)。