2014-01-15 10 views
5

Ich habe ein Repository von Bitbucket.org als Zip-Datei heruntergeladen und es mit iZip auf meinen Mac entpackt. Xcode hat viele Kompilierungsfehler gefunden, weil die Zip- oder Unzip-Funktion die Aliase nicht richtig gespeichert hat. Also habe ich hg verwendet, um den Repo zu klonen, die Aliase wurden beibehalten und der Xcode-Kompilierung war dann sauber. Ich möchte alle Aliase in meinem Ordner finden und sie durch ihre Ziele ersetzen, damit zukünftige Reißverschlüsse funktionieren. Ich habe viel gesucht und kann nichts finden, was sagt, wie man sie entweder mit dem Mac Finder Dienstprogramm oder dem bash find Befehl findet. Ich habe versucht, Finder-> All meine Dateien mit search-> Art-> Other-> Alias ​​und es findet etwa 100 Aliase, aber nicht die in meinem lokalen Repo, die ich weiß, sind da. Muss ich die OSX 10.9.1-Indexliste aller meiner Dateien irgendwie neu erstellen/aktualisieren? Hat der Befehl find ein Flag für OSX-Alias-Dateitypen? Kann ich den Finder zu einem Ordner navigieren und rekursiv nach einem Dateityp suchen (die Suchkriterienoption scheint zu verschwinden, wenn "Alle meine Dateien" nicht ausgewählt ist). Eine andere Alternative wäre, den Inhalt einer vollständigen Finder-Liste mit der Spalte "Kind" auszudrucken und anzuzeigen und dann danach zu sortieren.Wie benutze ich den Mac Finder um alle Aliase in einem Ordner aufzulisten

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

Scheint wie mdfind könnte funktionieren. Aber es findet nur die gleichen Dateien, die Finder-> All My Files mit search-> kind-> other-> alias findet. Diese Dateien und diejenigen in meinem Repo werden vom Finder als Kind "Alias" aufgelistet. Ich habe gelesen, dass es drei Arten von Links gibt: Alias, symbolische Links und harte Links. Die Auflistung der ls Befehl für eine Datei, die vom mdfind Befehl gefunden ist:

[email protected] 1 kenm staff 45100 Dec 25 2012 GTLDrive.h 

Die Auflistung der ls Befehl für eine Datei würde ich finden möchte, ist:

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

Finder ruft sie beide "Alias", aber ich denke, sie sind anders. Gibt es eine MDFIND-Befehlszeile, die den zweiten Alias-Typ findet?

Antwort

6

Im Terminal:

Dies sollte alle aliases (Apple-Aliase) finden

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

Für alle symlinks (symbolische Links) zu finden, können Sie:

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

Um nur Symlinks zeigen im aktuellen Verzeichnis:

ls -la | grep ^l 

Wenn Sie den vollständigen Pfad von Symlinks lesen:

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

Danke, l'L'l. Ich habe meine Frage oben mit Ihrem Vorschlag geändert, da meine Bearbeitung hier nicht passt. – KenM

+0

@KenM ah, Sie wollen die Symlinks finden, nicht die Aliase. Ich weiß, dass Apple nicht deutlich macht, dass sie sich deutlich unterscheiden. Ich habe meine Antwort aktualisiert :) –

+0

Danke, - Typ l hat funktioniert. – KenM

2

Apple-Alias ​​und Symlink verschmelzt hat. Ich weiß nicht, wie man das an der Kommandozeile macht, außer mit ls.

ls -la | grep ">" 

Die folgende Objective-C-Funktion würde das Ziel finden.

#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]; 
} 
+0

'ls -la | grep ">" 'würde auch Dateinamen finden, die'> 'enthalten. –

+0

Wahr, wenn jemand dumm genug war, ein Umleitungssymbol in einem Dateinamen zu verwenden, benutze 'ls -la | grep "\ ->" ' – Milliways

+0

Danke, Milliways.-la mit grep hat super geklappt. – KenM