Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Bash Mac find中排除包文件(目录)?_Bash_Macos_Find - Fatal编程技术网

如何从Bash Mac find中排除包文件(目录)?

如何从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文件,但不在其中搜索 我已经尝试了很多不同的

如何从Bash find命令的搜索路径中排除Mac软件包文件?

macOS有一些实际上是unix目录的“文件”。这些被称为“包”。Mac应用程序文件就是一个很好的例子,但也有其他例子。不幸的是,我没有看到任何用于排除包的find开关

这里有一个典型的find命令不起作用。它将在.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相吻合,下面是一个备选方案