How to use Mac Finder to list all aliases in a folder
Asked Answered
C

2

8

I downloaded a repository from Bitbucket.org as a zip file and unzipped it using iZip to my Mac. Xcode found many compile errors because the zip or unzip did not preserve aliases properly. So I used hg to clone the repo, the aliases were preserved, and the Xcode compile was then clean. I would like to find all the aliases in my folder and replace them by their targets so future zips will work. I've done a lot of searching and can't find anything that says how find them either with the Mac Finder utility or the bash find command. I've tried using Finder->All My Files with search->kind->other->alias and it finds about 100 aliases but not the ones in my local repo that I know are there. Do I need to rebuild/update the OSX 10.9.1 index list of all my files somehow? Does the find command have a flag for OSX alias file types? Can I navigate Finder to a folder and then search recursively for a file type (the search criteria option seems to disappear if All My Files is not selected). Another alternative would be to print to file the contents of a full Finder list with the "Kind" column showing and then sort by that.

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

Seems like mdfind might work. But it only finds the same files that Finder->All My Files with search->kind->other->alias finds. Those files and the ones in my repo are listed as Kind "Alias" by Finder. I've read that there are 3 kinds of links: Alias, Symbolic Links, and Hard Links. The listing by the ls command for a file found by the mdfind command is:

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

The listing by the ls command for a file I would like to find is:

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

Finder calls them both "Alias" but ls thinks they are different. Is there an mdfind command line that finds the second type of Alias?

Carnahan answered 15/1, 2014 at 23:5 Comment(0)
R
7

In Terminal:

This should find all aliases (Apple aliases)

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

For finding all symlinks (symbolic links) you can use:

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

To only show symlinks in current directory:

ls -la | grep ^l

If you want to view the full path of symlinks:

find /path/of/your/repo -type l
Renata answered 15/1, 2014 at 23:11 Comment(2)
Thanks, l'L'l. I modified my question above with your suggestion as my edit wouldn't fit here.Carnahan
@Carnahan ah, you want to find the symlinks, not the aliases. I know Apple doesn't make it very clear as to them being distinctly different; i've updated my answer :)Maier
G
2

Apple has conflated alias and symlink. I don't know how to do this at the command line other than using ls.

ls -la | grep ">"

The following Objective-C function would find the target.

#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];
}
Guevara answered 16/1, 2014 at 0:46 Comment(2)
ls -la | grep ">" would also find filenames containing >.Maier
True if anyone was silly enough to use a redirection symbol in a filename use ls -la | grep "\->"Guevara

© 2022 - 2024 — McMap. All rights reserved.