如何使用Mac Finder列出文件夹中的所有别名

时间:2014-01-15 23:05:04

标签: macos zip alias finder

我从Bitbucket.org下载了一个存储库作为zip文件,然后使用iZip将其解压缩到我的Mac上。 Xcode发现了许多编译错误,因为zip或unzip没有正确保留别名。所以我使用hg克隆了repo,保留了别名,然后Xcode编译就干净了。我想在我的文件夹中找到所有别名并将其替换为目标,以便将来的拉链工作。我已经做了很多搜索,找不到任何说明如何使用Mac Finder实用程序或bash find命令找到它们。我已经尝试使用Finder->所有我的文件与search-> kind-> other->别名,它找到大约100个别名,但不是我知道的本地仓库中的别名。我是否需要以某种方式重建/更新所有文件的OSX 10.9.1索引列表? find命令是否有OSX别名文件类型的标志?我可以将Finder导航到文件夹,然后递归搜索文件类型(如果未选择“所有文件”,搜索条件选项似乎会消失)。另一种方法是打印以显示完整Finder列表的内容,并显示“Kind”列,然后按此排序。

mdfind "kMDItemKind == 'Alias'" -onlyin /path/of/repo

似乎mdfind可能有效。但它只找到Finder->所有我的文件与搜索 - > kind->其他 - >别名找到相同的文件。那些文件和我的回购中的文件被Finder列为Kind“Alias”。我读过有3种链接:别名,符号链接和硬链接。 ls命令列出的mdfind命令找到的文件是:

-rw-r--r--@ 1 kenm staff 45100 Dec 25 2012 GTLDrive.h

ls命令列出我想要找到的文件:

lrwxr-xr-x 1 kenm staff 24 Jan 14 21:38 Headers -> ./Versions/A/Headers

Finder称他们为“Alias”,但我认为他们是不同的。是否有mdfind命令行找到第二种类型的别名?

2 个答案:

答案 0 :(得分:6)

在终点站:

这应该找到所有aliases(Apple别名)

mdfind "kMDItemKind == 'Alias'" -onlyin /path/of/your/repo

要查找所有symlinks(符号链接),您可以使用:

ls -lR /path/of/your/repo | grep ^l

仅显示当前目录中的符号链接:

ls -la | grep ^l

如果要查看符号链接的完整路径:

find /path/of/your/repo -type l

答案 1 :(得分:2)

Apple将别名和符号链接混为一谈。除了使用ls之外,我不知道如何在命令行执行此操作。

ls -la | grep ">"

以下Objective-C函数将找到目标。

#include <sys/stat.h>

NSURL *targetOfAlias(NSURL *url) {
    CFErrorRef *errorRef = NULL;
    CFDataRef bookmark = CFURLCreateBookmarkDataFromFile (NULL, (__bridge CFURLRef)url, errorRef);
    if (bookmark == nil) return nil;
    CFURLRef resolvedUrl = CFURLCreateByResolvingBookmarkData (NULL, bookmark, kCFBookmarkResolutionWithoutUIMask, NULL, NULL, NO, errorRef);
    return CFBridgingRelease(resolvedUrl);
}

NSString *getTarget(NSString *fPath) {
    NSString *resolvedPath = nil;
    // Use lstat to determine if the file is a symlink
    struct stat fileInfo;
    NSFileManager *fileManager = [NSFileManager new];
    if (lstat([fileManager fileSystemRepresentationWithPath:fPath], &fileInfo) < 0)
        return nil;
    if (S_ISLNK(fileInfo.st_mode)) {
        // Resolve the symlink component in the path
        NSError *error = nil;
        resolvedPath = [fileManager destinationOfSymbolicLinkAtPath:fPath error:&error];
        if (resolvedPath == nil) {
            NSAlert *alert = [NSAlert alertWithError:error];
            [alert runModal];
            return nil;
        }
        if ([resolvedPath isAbsolutePath])
            return resolvedPath;
        else
            return [[fPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:resolvedPath];
    }

    // Resolve alias
    NSURL *resolvedUrl = targetOfAlias([NSURL fileURLWithPath:fPath]);
    return [resolvedUrl path];
}