代码之家  ›  专栏  ›  技术社区  ›  JMichaelTX

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

  •  0
  • JMichaelTX  · 技术社区  · 8 年前

    macOS有一些真正的unix目录的“文件”。这些被称为“包裹”。Mac应用程序文件是一个很好的例子,但也有其他的例子。不幸的是,我没有看到任何查找开关来排除包。

    下面是一个典型的find命令,它不起作用。它将在.app文件中搜索:

    find /Applications -type f -path ./*.app -prune -o  -print
    

    在本例中,我希望它列出实际的.app文件,但不要在其中搜索。

    以下是其他一些典型的文件扩展名,它们实际上是包:
    .app .pkg .scptd

    1 回复  |  直到 8 年前
        1
  •  1
  •   CJK    8 年前

    插入对包目录中的所有内容返回false的正则表达式条件。不幸的是,这确实意味着必须列出要排除其内容的包目录的文件扩展名。我在regex字符串中列出了很多:

    find -E /Applications ! -iregex '.*\.(app(download)?|scptd|pkg|bundle|qlgenerator|c?action|dictionary|cannedSearch|photoslibrary)/.+'
    
        2
  •  0
  •   cycollins    7 年前

    试试这个。我从另一个答案(从用户那里)得到了一个捆绑测试 anonymous-coward ). 把它放到一个小脚本中,称之为“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”。你的 bundle mdls -name kMDItemContentTypeTree 在一些文件上,看看会出现什么,这将告诉您要传递到什么regex grep . 您可以对文件扩展名等进行附加测试。然后形成你的 find 这样的命令:

    find /Applications \( -exec bundle {} \; -print -prune \) -or -print
    

    Applications 因为这是一个例子,你会发现很多捆绑包和软件包。这个 -exec 如果shell结果不是0,则标记返回false(因为0始终表示作为shell结果的“成功”)。所以,左边的表达式 -or 意思是如果某个东西是一个包,我们将打印它的完整路径和 -prune -print 在…的右边 -或者 -执行官 或者其他一些操作员, 找到 禁止所有打印,因此如果路径是捆绑包(或包或脚本检测到的任何内容),则需要打印路径;如果路径不是捆绑包,则还需要打印路径。注意:这是你使用的钥匙 \; + 在测试结束之前 -打印 -修剪 . 否则 将要传递给的文件分组 捆 -打印 -执行官 在 或者双方,以防你想以某种方式处理文件,而不仅仅是寻找它们。原来这是一个例子,任何两类文件,你想处理不同的。希望这是有用的。这是一个有趣的练习,实际上在思考 找到 以及它的应用。