내 하드 드라이브에서 설명할 수 없는 기호 링크를 발견했습니다. 불행하게도 이러한 링크는 작동하지 않습니다. 즉, 링크를 클릭해도 원본 파일로 연결되지 않습니다. 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 파일 이름만 일치합니다(콘텐츠 또는 전체 디렉터리가 아님).
이로 인해 많은 잘못된 긍정이 발생하지만 심볼릭 링크와 해당 대상(깨진 또는 손상되지 않은)이 모두 포함됩니다.