终端搜索输出排除目录(而不是目录中的文件)

终端搜索输出排除目录(而不是目录中的文件)

我正在尝试在终端中进行递归搜索以查找所有非文件夹的文件;这是为了确认大型目录结构中没有内容。有办法做到这一点吗?

从另一个超级用户帖子开始查找具有特定扩展名的文件通过阅读“find”的手册页,我弄清楚了如何使用终端列出所有未命名为 的文件.DS_store。但这仍然是一个很长的列表。我思考它只是目录路径,但太多了,无法手动检查。我一直在寻找使用 FIND 或 grep 从输出中排除文件夹/路径的方法,但没有成功,但我觉得一定有办法。

到目前为止,我已经尝试过这些命令。使用 prune:

find "$PWD" -name ".ds" -prune -o -name "*.*" | xargs -0 ls -laht -P 1 find "$PWD" -name ".ds" -prune -o | xargs -0 ls -laht -P 1 find "$PWD" -name ".DS_Store" -prune -o | xargs -0 ls -laht -P 1\n find "$PWD" -name ".DS_Store" -prune -o -name "*.*" | xargs -0 ls -laht -P 1\n

令人尴尬的是,后者给了我答案。

使用名称/iname:

find -name ds find -iname ds find . -iname ds find . -iname "ds" find . -iname ".ds" find . -iname "\.ds" find . -iname "Store" find . -iname ".DS_Store".

都有print

最后,我对 find 感到沮丧,转而使用 grep:

find . -print | grep -v ds find . -print | grep -v DS

此时,我以为我已经准备好排除.DS_Store文件了。但我没有意识到我会排除名称中带有“DS”的任何文件。

我也读过手册页,也用谷歌搜索过类似的东西,比如 [递归搜索 macos 排除所有文件夹终端]。这就是我找到上面提到的帖子的方式,以及https://www.crybit.com/exclude-directories/

但它们最终都是排除特定目录,而不是将目录作为一个类别。

答案1

在 中,find您可以使用 来查找目录-type d。要查找非目录,您需要否定此测试:! -type d

寻找文件命名的文件,.DS_store则使用-name .DS_store。要查找未命名的文件,.DS_store您需要否定此测试:! -name .DS_store

以下命令应用两个否定测试。它们通过隐式-a(连接,AND 运算符)连接:

find . ! -type d ! -name .DS_store

隐含的操作是-print。通过两个测试的文件的路径名将被打印。

-a为了进行比较,明确使用相同的命令-print

find . ! -type d -a ! -name .DS_store -print

相关内容