【问题标题】:How to use script to detect whether a file is alias or origin in Mac OS如何在 Mac OS 中使用脚本检测文件是别名还是来源
【发布时间】:2023-03-27 01:17:02
【问题描述】:

我正在编写一个脚本来检测一个文件是否是另一个文件的别名,如下所示,但似乎别名与符号链接的概念不同。

我怎样才能让它工作?

filePath=./aliasfile
echo $filePath
if [ -e "$filePath" ]; then
    if [ ! -L "$filePath" ]
    then
        echo "$filePath is not alias"
    else
        echo "$filePath is alias"
    fi
else
  echo "=> $filePath doesn't exist"
fi

【问题讨论】:

标签: bash macos shell finder


【解决方案1】:

别名和符号链接在概念上非常相似,但在细节上有很大不同。 macOS 有两种不同的方式来做本质上相同的事情的原因在于它的历史:它源自“经典”Mac OS(Mac OS 9 及其前身)和 unix。 “别名”文件是经典 Mac OS 执行快捷方式文件的方式的后代,而符号链接是 unix 执行文件系统快捷方式的方式。为了兼容性(以及一定程度上的灵活性),macOS 支持两者。

嗯,主要是:unix (/POSIX) API 只识别符号链接,并将别名视为普通文件。这就是-L 测试无法识别别名文件的原因。

我最初建议通过 typecreator codes 来识别别名文件,但在调查了 @Toby 的评论后,结果发现这比我意识到的要复杂得多。在最新版本的 macOS 中,文件别名的类型为“alis”,创建者的类型为“MACS”,但文件夹的别名类型为“fdrp”,应用程序的别名类型为“fapa”。在旧版本中,我发现类型为“adrp”的应用程序的别名和从原始应用程序复制的创建者,以及具有空类型代码(!)的文件的别名。可能还有其他组合,我就不推荐了。

相反,Toby 的建议似乎很有效:mdls -raw -name kMDItemContentType /path/to/file 将为别名文件打印“com.apple.alias-file”。

这是我更新的脚本:

filePath=./aliasfile
echo "$filePath"    # You should (almost) always double-quote variable references
if [ ! -e "$filePath" ]
then
  echo "=> $filePath doesn't exist"

elif [ -L "$filePath" ]
then
    echo "$filePath is alias (well, technically a symlink)"

elif [ -f "$filePath" ] &&
     mdls -raw -name kMDItemContentType "$filePath" 2>/dev/null | grep -q '^com\.apple\.alias-file$'
then
    echo "$filePath is alias (a Finder-style one)"

else
    echo "$filePath is not alias"
fi

【讨论】:

  • 似乎不再适用于 10.15 Catalina(不确定以前的版本)。 FinderInfo 扩展属性对我来说有一个 fdrpMACS 前缀,而不是 alisMACS,我确保创建一个 Finder 别名而不是符号链接。我的替代方法是:mdls -raw -name kMDItemContentType <path>。对于 Finder 别名,它将返回 com.apple.alias-file
  • @Toby 显然它根据原始项目的类型使用不同的类型代码(并且它在操作系统版本之间发生了变化,尽管不是最近)。所以我更新了我的答案以使用你的 mdls 方法。
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2016-01-03
  • 2011-02-09
  • 2019-10-10
相关资源
最近更新 更多