我正在尝试在终端中进行递归搜索以查找所有非文件夹的文件;这是为了确认大型目录结构中没有内容。有办法做到这一点吗?
从另一个超级用户帖子开始查找具有特定扩展名的文件通过阅读“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