Mac OSX 10.6
我有一些别名指向错误的卷。我想在我的整个层次结构中搜索此类别名。它们是别名,而不是符号链接,所以我不能只做
find / -type l -ls | grep badVolumeName
。
别名似乎有一个 com.apple.ResourceFork,但是使用
xattr
查询它会给出二进制数据。有没有办法将别名的目标转储为文本,以便我可以 grep 查找错误的卷名称?或者还有什么其他方法可以做到这一点?
要查找别名文件,您可以使用StackOverflow 上的这个答案。首先,创建一个脚本
is_alias.sh
:
#! /bin/bash
[ "$(mdls -raw -name kMDItemKind "$1")" = "Alias" ]
然后运行
find . -type f -exec ./is_alias.sh {} \; -print
获取别名的路径似乎相当困难。
有人发布了一个使用MacPerl的解决方案,但由于我没有MacPerl,所以我没有测试过这个,不知道它是否有效。
AskDifferent 上有一个类似的问题,有几个不同的建议,但似乎都没有真正解决问题。 Applescript 的答案是好的,但是获取别名文件的“原始项目”这一关键操作似乎不适用于损坏的别名。
您还可以看看这个问题,其中可能有一些可可解决方案。
bash 脚本对我不起作用,因为我在 zsh 中运行它。所以我用 find 运行了下面的 perl 脚本:
find . -type f -print0|xargs -0 isAlias.pl
这是 Perl 脚本:
#!/usr/bin/perl -w
while ( my $name = shift @ARGV ) {
#print $name;
open my $fh, "-|", ( 'mdls', '-n', 'kMDItemKind', '--', $name ) or die "Failed spawning mdls on '$name': $!";
my @output_lines = <$fh>;
close $fh;
#print " ", scalar @output_lines, " ";
#print "'", @output_lines, "'\n";
#chomp $output_lines[0];
$output_lines[0] =~ m/kMDItemKind = "([^"]+)"/ or die "Failed getting ItemKind: $!";
my $kind = $1;
if ($kind =~ m/Alias/) {
print "'$name' is an alias\n";
}
#else {
# print "\n";
#}
}