使用空标志时查找命令排除隐藏文件

时间:2021-07-07 19:09:57

标签: bash macos find

我正在寻找一种使用 find 命令来判断文件夹中是否没有文件的方法。我曾尝试使用 -empty 标志,但由于我在 macOS 上,操作系统放置在目录中的系统文件(例如 .DS_Store 导致 find 不认为目录为空。我曾尝试告诉 find 忽略 .DS_Store 但它仍然认为目录不为空,因为该文件存在。

有没有办法让 find 从它认为的 -empty 中排除某些文件?还有没有办法让 find 返回一个没有可见文件的目录列表?

1 个答案:

答案 0 :(得分:1)

-empty predicate 相当简单,如果目录具有除 ... 以外的任何条目,则适用。

有点丑陋的解决方案,但您可以使用 -exec 在每个目录中运行另一个 find,这将实现您决定要包含哪些目录的标准。

以下:

  • 外部 find 将为 sh -c 中的每个目录执行 /starting/point
  • sh 将执行另一个具有不同条件的 find
  • 内部 find 将打印第一个匹配项,然后退出
  • read 将消耗内部 find 的输出(如果有)。仅当内部 read 打印至少一行时,find 的退出状态才会为 0,否则为非零
  • 如果内部 find 没有输出,外部 find-exec 谓词将评估为 false
  • 因为 -exec 后面跟着 -o,所以下面的 -print 动作只会对那些与内部 find 的条件不匹配的目录执行
find /starting/point \
  -type d \( \
    -exec sh -c \
      'find "$1" -mindepth 1 -maxdepth 1 ! -name ".*" -print -quit | read' \
      sh {} \; \
    -o -print \
  \)