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

8

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

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

看起来 mdfind 可能有用。但它只能找到与 Finder->所有我的文件 搜索->种类->其他->别名 相同的文件。Finder 列出这些文件和我的存储库中的文件的类型为“别名”。我已经阅读过有关链接的三种类型的信息:别名、符号链接和硬链接。通过 mdfind 命令找到的文件的 ls 命令列表如下:

-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称它们都是“别名”,但ls认为它们是不同的。是否有mdfind命令行可以找到第二种类型的Alias?

2个回答

7

在终端中:

这应该会找到所有的 alias(苹果别名)

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

要查找所有符号链接(symbolic links),可以使用以下命令:

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

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

ls -la | grep ^l

如果您想查看符号链接的完整路径:
find /path/of/your/repo -type l

谢谢,l'L'l。我按照您的建议修改了我的问题,因为我的编辑无法适应这里。 - KenM
@KenM 哦,你想找符号链接,而不是别名。我知道苹果没有很清楚地表明它们有着明显的区别;我已经更新了我的答案 :) - l'L'l

2

苹果将别名(alias)和符号链接(symlink)混为一谈。除了使用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];
}

ls -la | grep ">" 也会找到包含 > 的文件名。 - l'L'l
如果有人在文件名中使用重定向符号,请使用ls -la | grep "\->",返回True。 - Milliways

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接