Mac OS X "별칭" 파일을 모두 찾고 해당 대상 파일을 찾으려면 어떻게 해야 합니까(깨진 링크에도 불구하고)?

Mac OS X "별칭" 파일을 모두 찾고 해당 대상 파일을 찾으려면 어떻게 해야 합니까(깨진 링크에도 불구하고)?

내 하드 드라이브에서 설명할 수 없는 기호 링크를 발견했습니다. 불행하게도 이러한 링크는 작동하지 않습니다. 즉, 링크를 클릭해도 원본 파일로 연결되지 않습니다. Finder는 이를 "별칭"으로 표시하지만 Mac OS 별칭 파일은 아닙니다.

이제 내 하드 드라이브에서 모든 심볼릭 링크를 찾고 싶습니다. 그런 다음 각 파일에 대해 한때 연결되었던 파일을 검색합니다(아마도 동일한 하드 드라이브에 있음). 그런 다음 파일을 동일한 하위 디렉터리에 복사합니다.

대략적으로 말하면, 내가 원하는 의사코드 솔루션은 다음과 같이 작성될 수 있습니다.

FIND all files (in Directory) type=SYMLINK. FOR each one, DO ..
      FIND referentFile (somewhere on the HDD)
      cp referentFile to (Subdirectory that contains the alias).
DONE.

매우 감사합니다.

답변1

이 질문의 첫 번째 부분에 대한 답변이 있습니다.서로 다른 의견을 표현하다:

별칭을 찾는 명령은 다음과 같습니다.

mdfind kMDItemKind="Alias"

일반적으로 말하면 다음을 사용할 수 있습니다.찾다(메타데이터 조회) 명령은 파일을 (매우) 빠르게 검색합니다. 매뉴얼 페이지에서:

이것찾다이 명령은 중앙 메타데이터 저장소를 쿼리하고 지정된 메타데이터 쿼리와 일치하는 파일 목록을 반환합니다. 쿼리는 문자열이거나 쿼리 표현식일 수 있습니다.

그래서 나는 아직 OSX를 포기하지 않을 것이다. 사실 mdfind이것은 제가 Linux를 사용할 때 OSX에 대해 가장 그리워하는 점 중 하나입니다.

불행히도 문제의 두 번째 부분은 놀랍게도 해결하기가 더 어렵습니다. 관련 StackExchange 게시물을 찾았습니다.

이로 인해 몇 가지 잠재적인 솔루션에 대해 생각하게 되었습니다.

블로그 포스팅 중 제가 제일 좋아하는터미널이 심볼릭 링크와 같은 별칭을 따르도록 만듭니다.. 그것은 참조한다getTrueName.c라는 작은 오픈 소스 C 프로그램. 소스 코드는 다음과 같습니다.

// 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 );
  }

이 소스 코드를 다운로드하고 다음을 사용하여 컴파일했습니다.

gcc -o getTrueName -framework Carbon getTrueName.c

물론 테스트해보고 싶습니다. 터미널을 떠나지 않기 위해 다음을 사용하여 별칭을 만들었습니다.

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

그런 다음 이 프로그램을 사용하여 별칭을 확인했습니다 getTrueName.

user@host:~$ ./getTrueName ~/Desktop/alias-target

/tmp/alias-target

승리!

블로그 게시물어리석은 Mac OS X 트릭: 별칭 해결해결책도 있을 것 같습니다. 여기에는 다음 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;

필요한 라이브러리도 없었고, 많은 것을 설치하고 싶지도 않았기 때문에 이를 포기했습니다.

나도 찾았어mac_alias, 유망해 보입니다. 5~10분 동안 이것저것 만지작거렸지만 별칭 대상을 해결하는 방법을 알 수 없습니다.

답변2

깨진 심볼릭 링크의 참조 파일을 찾는 방법을 알아냈을 수도 있습니다.

[그런데 저는 OP입니다. 원본 로그 메시지를 찾을 수 없어서 재등록했습니다. ]

dupeGuru와 같은 중복 파일 찾기를 사용하세요. 이것을 o로 설정하면 기호 링크와 참조가 포함된 전체 디렉터리/드라이브를 검색합니다. o 다양한 유형의 파일을 혼합합니다. o 부정확한 일치는 괜찮습니다(예: 확실성 수준 약 80%). o 파일 이름만 일치합니다(콘텐츠 또는 전체 디렉터리가 아님).

이로 인해 많은 잘못된 긍정이 발생하지만 심볼릭 링크와 해당 대상(깨진 또는 손상되지 않은)이 모두 포함됩니다.

관련 정보