A primeira parte desta pergunta tem uma resposta em AskDifferent :
Aqui está o comando para encontrar aliases:
mdfind kMDItemKind="Alias"
Em geral, você pode usar o mdfind (MetaData Find) para (muito) procurar rapidamente por arquivos. Das man-pages:
The mdfind command consults the central metadata store and returns a list of files that match the given metadata query. The query can be a string or a query expression.
Então, eu não desistiria do OSX ainda. Na verdade, mdfind
é uma das coisas que mais sinto falta do OSX quando estou no Linux.
Infelizmente, a segunda parte desta questão foi surpreendentemente mais difícil de resolver. Encontrei algumas postagens relevantes do StackExchange:
Isso me levou a várias soluções possíveis.
Meu favorito veio da postagem do blog Faça o acompanhamento do terminal Aliases como links simbólicos . Faz referência a um pequeno programa C de código aberto chamado getTrueName.c . Aqui está o código fonte:
// getTrueName.c
//
// DESCRIPTION
// Resolve HFS and HFS+ aliased files (and soft links), and return the
// name of the "Original" or actual file. Directories have a "/"
// appended. The error number returned is 255 on error, 0 if the file
// was an alias, or 1 if the argument given was not an alias
//
// BUILD INSTRUCTIONS
// gcc-3.3 -o getTrueName -framework Carbon getTrueName.c
//
// Note: gcc version 4 reports the following warning
// warning: pointer targets in passing argument 1 of 'FSPathMakeRef'
// differ in signedness
//
// COPYRIGHT AND LICENSE
// Copyright 2005 by Thos Davis. All rights reserved.
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307 USA
#include <Carbon/Carbon.h>
#define MAX_PATH_SIZE 1024
#define CHECK(rc,check_value) if ((check_value) != noErr) exit((rc))
int main ( int argc, char * argv[] )
{
FSRef fsRef;
Boolean targetIsFolder;
Boolean wasAliased;
UInt8 targetPath[MAX_PATH_SIZE+1];
char * marker;
// if there are no arguments, go away
if (argc < 2 ) exit(255);
CHECK( 255,
FSPathMakeRef( argv[1], &fsRef, NULL ));
CHECK( 1,
FSResolveAliasFile( &fsRef, TRUE, &targetIsFolder, &wasAliased));
CHECK( 255,
FSRefMakePath( &fsRef, targetPath, MAX_PATH_SIZE));
marker = targetIsFolder ? "/" : "" ;
printf( "%s%s\n", targetPath, marker );
exit( 1 - wasAliased );
}
Eu baixei este código fonte e o compilamos usando o seguinte comando:
gcc -o getTrueName -framework Carbon getTrueName.c
Claro que queria testá-lo. Para evitar deixar o terminal, criei um alias usando os seguintes comandos:
user@host:~$ FULL_PATH_TO_TARGET_FILE=/tmp/alias-target
user@host:~$ echo "testing" > "${FULL_PATH_TO_TARGET_FILE}"
user@host:~$ osascript \
-e 'tell application "Finder"' \
-e "make new alias to file (posix file \"${FULL_PATH_TO_TARGET_FILE}\") at desktop" \
-e 'end tell'
alias file alias-target of folder Desktop of folder user of folder Users of disk MacHD
Em seguida, verifiquei o Alias usando o programa getTrueName
:
user@host:~$ ./getTrueName ~/Desktop/alias-target
/tmp/alias-target
Vitória!
A postagem no blog Truques do Mac OS X estúpidos: Resolvendo aliases também parece que pode ter uma solução. Ele continha o seguinte script Perl:
#!/usr/local/bin/perl
use Mac::Errors;
use Mac::Files;
use Mac::Resources;
my $path = '/Users/pudge/Desktop/some alias';
my $res = FSpOpenResFile($path, 0) or die $Mac::Errors::MacError;
# get resource by index; get first "alis" resource
my $alis = GetIndResource('alis', 1) or die $Mac::Errors::MacError;
my $link = ResolveAlias($alis);
print $link;
Eu não tinha as bibliotecas necessárias e não queria instalar um monte de coisas, então desisti dessa.
Também encontrei as mac_alias , que pareciam promissoras. Passei 5 ou 10 minutos mexendo nele, mas não consegui descobrir como resolver um destino de alias.