Mac OS 中如何使用脚本检测文件是别名还是来源

How to use script to detect whether a file is alias or origin in Mac OS

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

我怎样才能让它工作?

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

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

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

我最初建议通过 type and creator 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