web-dev-qa-db-ja.com

Mac OS Xの「エイリアス」ファイルをすべて見つけて、それらのターゲットファイルを見つけるにはどうすればよいですか(リンク切れにもかかわらず)。

私はエイリアス自体ではなくシンボリックリンクを扱っていることを理解しました。 (何らかの理由で、Finderでエイリアスとして表示されます。)

HDDに原因不明のSYMLINKSがたくさんあります。残念ながら、SYMLINKSは機能しません。つまり、クリックしてもファイルにアクセスできません。

だから今私は私のHDDにすべてのSYMLINKSを見つけたいと思います。次に、それぞれについて、おそらく同じHDDにある、一度リンクされたファイルを検索します。次に、そのファイルをSYMLINKと同じサブディレクトリにコピーします。

大まかに言えば、

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.

どうもありがとう。 PS-これについては、厳密にLinuxに戻ることを本当に考えています。設定が簡単であればあるほど、データ災害の可能性は低くなります-笑.

5
ericlindellnyc

この質問の最初の部分は AskDifferent に関する回答です。

エイリアスを検索するコマンドは次のとおりです。

mdfind kMDItemKind="Alias"

一般に、 mdfind (MetaData Find)コマンドを使用して、ファイルを(非常に)すばやく検索できます。マンページから:

mdfindコマンドは、中央のメタデータストアを調べ、指定されたメタデータクエリに一致するファイルのリストを返します。クエリは文字列またはクエリ式にすることができます。

だから私はまだOSXをあきらめません。実際、mdfindは、Linuxを使用しているときにOSXで最も見逃しているものの1つです。

残念ながら、この質問の2番目の部分は驚くほど解決が困難でした。関連するStackExchangeの投稿をいくつか見つけました。

これらは私にいくつかの潜在的な解決策を導きました。

私のお気に入りはブログの投稿 Symlinksのようなエイリアスに従うエイリアスを作成する から来ました。それは 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分かけていじっていましたが、エイリアスターゲットを解決する方法を理解できませんでした。

1
igal

壊れたシンボリックリンクの参照ファイルを見つける方法を見つけたかもしれません。

[ところで、私はOPです。元のloginfoが見つからなかったので、新たにサインアップしました。]

DupeGuruのような重複ファイルファインダーを使用します。それをoに設定します。シンボリックリンクとリファレントを含むディレクトリ/ドライブ全体を検索します。 o異なるタイプのファイルを混在させます。 o不正確な一致は問題ありません(つまり、確実性レベルは約80%)。 oファイル名のみに一致します(コンテンツやディレクトリ全体ではありません)。

これにより多くの誤検知が発生しますが、シンボリックリンクとその指示対象(壊れているかそのまま)が含まれます。

0
Eric Schayer