如何从Bash Mac find中排除包文件(目录)?
如何从Bash find命令的搜索路径中排除Mac软件包文件? macOS有一些实际上是unix目录的“文件”。这些被称为“包”。Mac应用程序文件就是一个很好的例子,但也有其他例子。不幸的是,我没有看到任何用于排除包的find开关 这里有一个典型的find命令不起作用。它将在.app文件中搜索:如何从Bash Mac find中排除包文件(目录)?,bash,macos,find,Bash,Macos,Find,如何从Bash find命令的搜索路径中排除Mac软件包文件? macOS有一些实际上是unix目录的“文件”。这些被称为“包”。Mac应用程序文件就是一个很好的例子,但也有其他例子。不幸的是,我没有看到任何用于排除包的find开关 这里有一个典型的find命令不起作用。它将在.app文件中搜索: find /Applications -type f -path ./*.app -prune -o -print 在本例中,我希望它列出实际的.app文件,但不在其中搜索 我已经尝试了很多不同的
find /Applications -type f -path ./*.app -prune -o -print
在本例中,我希望它列出实际的.app文件,但不在其中搜索
我已经尝试了很多不同的方法,但都没有成功
下面是一些真正的软件包的其他典型文件扩展名:.app.pkg.scptd
插入一个regex标准,该标准对包目录中的所有内容返回false。不幸的是,这确实意味着必须列出要排除其内容的包目录的文件扩展名。我在我的正则表达式字符串中列出了很多:
find -E /Applications ! -iregex '.*\.(app(download)?|scptd|pkg|bundle|qlgenerator|c?action|dictionary|cannedSearch|photoslibrary)/.+'
插入一个regex条件,该条件对包目录中的所有内容返回false。不幸的是,这确实意味着必须列出要排除其内容的包目录的文件扩展名。我在我的正则表达式字符串中列出了很多:
find -E /Applications ! -iregex '.*\.(app(download)?|scptd|pkg|bundle|qlgenerator|c?action|dictionary|cannedSearch|photoslibrary)/.+'
试试这个。我从另一个答案(来自用户)得到了一个捆绑测试。将其放入一个小脚本并称之为“bundle”,如下所示:
#!/bin/bash
content_tree=$(mdls -name kMDItemContentTypeTree "$@" | grep -E '\"com.apple.bundle\"')
[[ ! -z "$content_tree" ]] && exit 0 || exit 1
(请随意改进我的bash。)如果参数是指向Bundle的路径,Bundle将返回0(成功),否则返回1。它生成一些特定于Mac的元数据并查找bundle特性。如果您希望更明确地避免使用软件包,而不是其他类型的捆绑包,您可以查找“com.apple.package”。您的捆绑包
脚本可以选择您想要的任何内容。在一些文件上运行mdls-name kMDItemContentTypeTree
,查看出现了什么,这将告诉您要传递给grep
的正则表达式。您可以进行额外的测试,例如文件扩展名等。然后按如下方式形成find
命令:
find /Applications \( -exec bundle {} \; -print -prune \) -or -print
我只是使用了
应用程序
,因为这是一个示例,您可以在其中找到许多捆绑包和包。如果shell结果不是0,则-exec
标记返回false(因为0作为shell结果总是表示“成功”)。因此,-或
左侧的表达式表示,如果某个内容是一个捆绑包,我们将打印其完整路径,-prune
表示我们将不进入目录。-or
右侧看似多余的-print
是因为如果使用-exec
或其他操作符,find
会抑制所有默认打印,因此如果路径是捆绑包(或包或脚本检测到的任何内容),则需要显式打印路径,如果路径不是,则也需要打印路径。注意:使用\,这是关键在-print
和-prune
之前的测试结束时,code>和not+
。否则,find
会将大量文件分组以传递给bundle
,您需要为每个文件获得一个答案。您可以在-或的任一侧或两侧使用-exec
替换-print
操作符,以防您想以某种方式处理文件而不是仅仅查找它们。事实证明,这是您希望以不同方式处理的任意两类文件的一个示例。希望这是有用的。这是一个有趣的练习,实际上在思考如何形成find
表达式方面非常有趣。试试这个。我从另一个答案(来自用户)得到了一个捆绑测试。将其放入一个小脚本并称之为“bundle”,如下所示:
#!/bin/bash
content_tree=$(mdls -name kMDItemContentTypeTree "$@" | grep -E '\"com.apple.bundle\"')
[[ ! -z "$content_tree" ]] && exit 0 || exit 1
(请随意改进我的bash。)如果参数是指向Bundle的路径,Bundle将返回0(成功),否则返回1。它生成一些特定于Mac的元数据并查找bundle特性。如果您希望更明确地避免使用软件包,而不是其他类型的捆绑包,您可以查找“com.apple.package”。您的捆绑包
脚本可以选择您想要的任何内容。在一些文件上运行mdls-name kMDItemContentTypeTree
,查看出现了什么,这将告诉您要传递给grep
的正则表达式。您可以进行额外的测试,例如文件扩展名等。然后按如下方式形成find
命令:
find /Applications \( -exec bundle {} \; -print -prune \) -or -print
我只是使用了应用程序
,因为这是一个示例,您可以在其中找到许多捆绑包和包。如果shell结果不是0,则-exec
标记返回false(因为0作为shell结果总是表示“成功”)。因此,-或
左侧的表达式表示,如果某个内容是一个捆绑包,我们将打印其完整路径,-prune
表示我们将不进入目录。-or
右侧看似多余的-print
是因为如果使用-exec
或其他操作符,find
会抑制所有默认打印,因此如果路径是捆绑包(或包或脚本检测到的任何内容),则需要显式打印路径,如果路径不是,则也需要打印路径。注意:使用\,这是关键在-print
和-prune
之前的测试结束时,code>和not+
。否则,find
会将大量文件分组以传递给bundle
,您需要为每个文件获得一个答案。您可以在-或的任一侧或两侧使用-exec
替换-print
操作符,以防您想以某种方式处理文件而不是仅仅查找它们。事实证明,这是您希望以不同方式处理的任意两类文件的一个示例。希望这是有用的。这是一个有趣的练习,实际上在思考如何形成find
表达式方面非常有趣。为了与@cycollins相吻合,下面是一个备选方案