如何使用脚本检测文件在Mac OS中是别名还是原始文件

问题描述 投票:0回答:1

我正在编写脚本来检测一个文件是否是另一个文件的alias,如下所示,但是别名似乎与symlink不同。您能否建议如何使它起作用。提前致谢。

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个回答
0
投票
主要是:Unix(/ POSIX)API仅识别符号链接,并将别名视为纯文件。这就是-L测试无法识别别名文件的原因。

识别别名文件的可靠方法也是Mac OS的经典版本中的保留:文件typecreator codes。经典Mac OS使用这些文件的方式大致与大多数OS(包括当前的macOS)使用文件扩展名的方式相同:它们标识文件包含的数据的格式(类型),以及应使用哪个应用程序打开文件(创建者)。 macOS大多已弃用类型和创建者代码,但仍用于别名文件。别名的类型为“ alis”,创建者为“ MACS”。

用于获取类型和创建者代码的API尚无法从命令行获得,但是现在这些代码(以及其他一些旧式文件信息)作为名为com.apple.FinderInfo的扩展属性公开了,您可以用xattr命令得到它:

$ xattr -l ExampleAlias com.apple.FinderInfo: 00000000 61 6C 69 73 4D 41 43 53 80 00 00 00 00 00 00 00 |alisMACS........| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

请注意,该属性包含非ASCII数据,因此xattr -l将其以十六进制以及ASCII形式转储。为了进行测试,最好使用xattr -xp直接在十六进制中直接打印该属性:

$ xattr -xp com.apple.FinderInfo ExampleAlias
61 6C 69 73 4D 41 43 53 80 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

您可以通过在行首搜索“ 61 6C 69 73 4D 41 43 53”的输出来测试。但是非别名文件通常没有此属性,因此您会收到错误消息:

$ xattr -xp com.apple.FinderInfo NotAnAlias
xattr: NotAnAlias: No such xattr: com.apple.FinderInfo

...所以您需要将错误重定向到/ dev / null。有了所有这些(以及一些条件重新安排),这就是我得到的:

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" ] &&
     xattr -xp com.apple.FinderInfo "$filePath" 2>/dev/null | grep -q '^61 6C 69 73 4D 41 43 53'
then
    echo "$filePath is alias (a Finder-style one)"

else
    echo "$filePath is not alias"
fi
© www.soinside.com 2019 - 2024. All rights reserved.