it-swarm-ko.tech

OS X에서 디렉토리에 대한 하드 링크를 작성하는 Unix 명령은 무엇입니까?

OS X에서 디렉토리를 가리키는 하드 링크 (symlink 또는 Mac OS 별명과 달리)를 작성하는 방법 "ln target destination"명령을 이미 알고 있지만 대상이 파일 인 경우에만 작동합니다. 다른 Unix 환경과 달리 Mac OS는 폴더에 대한 하드 링크를 허용하지만 (예 : Time Machine에 사용됨), 직접 수행하는 방법을 모르겠습니다.

48
username

그러면 BASH에서 직접 할 수 없습니다. 그러나 ... 간접적으로 수행하는 방법을 설명하는 기사를 여기에서 찾았습니다. http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html by 간단한 작은 C 프로그램을 컴파일 :

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   if (argc != 3) return 1;

   int ret = link(argv[1], argv[2]);

   if (ret != 0) perror("link");

   return ret;
}

... 그리고 다음을 사용하여 Terminal.app에서 빌드하십시오.

$ gcc -o hlink hlink.c -Wall
31
username

폴더/디렉토리를 하드 링크하면주의하지 않으면 문제가 발생할 수 있지만 매우 확실한 이점이 있습니다. Time Machine은 완벽한 예입니다. 그것들이 없다면, 중복 파일 버전의 복제가 가장 큰 디스크조차도 매우 빨리 소비하기 때문에 실용적이지 않을 것입니다.

Snow Leopard는 Amit Singh의 6 가지 규칙을 따르는 한 디렉토리에 대한 하드 링크를 만들 수 있습니다.

  1. 파일 시스템은 HFS +로 저널링되어야합니다.
  2. 소스와 대상의 상위 디렉토리가 달라야합니다.
  3. 소스의 부모는 루트 디렉토리가 아니어야합니다.
  4. 대상은 루트 디렉토리에 없어야합니다.
  5. 대상은 소스의 자손이 아니어야합니다.
  6. 목적지에는 디렉토리 하드 링크 인 조상이 없어야합니다.

따라서 Snow Leopard가 폴더에 대한 하드 링크를 만드는 기능을 잃어버린 것은 전혀 올바르지 않습니다.

방금 6 가지 규칙을 따르는 한 링크/링크 해제가 Snow Leopard에서 작동하는지 확인했습니다. 방금 시도했지만 Snow Leopard 10.6.6 시스템에서 제대로 작동합니다. 부팅 볼륨과 별도의 USB 외부 볼륨에서 시도했지만 두 경우 모두 제대로 작동했습니다.

"hunlink.c"프로그램은 다음과 같습니다 :

#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
   if (argc != 2)
      return 1;
   int ret = unlink(argv[1]);
   if (ret != 0)
      perror("unlink");
   return ret;
}

gcc -o hunlink hunlink.c

따라서 시도 할 경우주의하십시오. 규칙을 따르고 hlink를 사용하여 이러한 하드 링크를 작성하고 hunlink를 사용하여 하드 링크를 제거하십시오. 나중에 수행 한 작업이나이를 알아야하는 다른 사람을 위해 문서화 한 것을 잊지 마십시오.

폴더에 대한 "하드 링크"에 대해 방금 배운 다른 "gotcha" 그것들을 만들 때 Mac OS X의 "커튼 뒤에"많은 일이 발생합니다. 정말로 중요한 문제 중 하나는 링크를 생성 한 폴더가 /.HFS+라는 초 매직 슈퍼 숨김 폴더로 이동한다는 것입니다. 개인 디렉터리 데이터 % 000d/dir_xxx 여기서 xxx는 "source_folder"의 inode 번호입니다. 명령 형식은 다음과 같습니다.

hlink source_folder target_folder

따라서이 때문에 "source_folder"에서 파일을 열지 않도록주의해야합니다. 그렇게하면 파일이 수퍼 매직 폴더로 옮겨 져서 변경 사항을 저장하려고하면 문제가 발생할 수 있습니다. "source_folder"에서 열린 파일들에 이것이 일어나고있는 일이 일어나기 전까지 나에게 두 번 일어 났으며 해결책은 매우 간단합니다. 원래 "source_folder"에있는 모든 폴더/디렉토리에 대해 재미있는 오류없이 더 이상 "ls -la"명령을 수행 할 수 없지만 "ls"명령을 수행하면 모두 제대로 표시됩니다.

"Disk Utility"프로그램에서 "Verify disk"를 실행하면 아마도 "Volify 비트 맵에 고아 블록에 대한 약간의 복구가 필요합니다"라는 메시지가 표시 될 것입니다. "source_folder"의 이동.

이 상황에서 "분리 된 블록"이있는 경우 "source_folder"트리를 포함하는 볼륨이 아닌 다른 임시 위치에 변경된 파일을 저장 한 다음 "디스크 유틸리티"를 사용하여 볼륨을 마운트 해제하고 다시 마운트하십시오. "source_folder"또는 컴퓨터를 다시 시작하십시오. 그런 다음 임시 위치에 저장 한 파일을 원래 위치로 다시 복사하면 업무를 다시 시작해야합니다. 이것이 나를 위해 일한 것이므로 이것이 당신에게도 효과가 있다고 보장 할 수는 없습니다. 따라서 만일의 경우를 대비하여 백업이 좋은 볼륨에서 시도해 보는 것이 좋습니다.

폴더에 대한 하드 링크를 만드는 간단한 작업을 위해서만이 오버 헤드가 발생한다는 것은 매우 이상하게 보입니다. Mac OS X이 폴더에 대한 이러한 하드 링크 생성을 위해이 모든 노력을 기울인 이유를 아는 사람이 있습니까? 이것이 "저널링 된"파일 시스템이라는 사실과 관련이 있습니까?

나는 그의 "hfsdebug"유틸리티에 대한 Amit Singh의 설명을 읽음으로써 매우 마법적이고 숨겨진 위치에 관한 정보를 발견했다. 자세한 내용을 보려면 Amit Singh의 hfsdebug utility 에서 그의 웹 사이트를 참조하십시오. 매우 흥미로운 소프트웨어이며 HFS + 파일 시스템에 대한 많은 정보를 알려줍니다. 무료이며 다운로드하여 사용해 보는 것이 좋습니다. 더 이상 지원되지 않지만 기본적으로 HFS + 지원 시스템 인 Snow Leopard와 Leopard에서 모두 작동합니다. "읽기 전용"도구이기 때문에 실제로 해를 끼칠 수는 없습니다. 따라서 파일 시스템의 세부 사항을 살펴 보는 것이 좋습니다.

이러한 "폴더에 대한 하드 링크"에 대한 또 하나의 문제-일단 폴더를 만들고 슈퍼 마법의 비밀-숨겨진 폴더를 만들면 좋습니다. 처음에 폴더를 생성 한 폴더를 연결 해제하더라도이 매직 폴더는 그대로 유지됩니다. 왜 그런지 확실하지는 않지만 확실합니다. "hfsdebug"를 사용하여 시도해 볼 수 있습니다. "hfsdebug"를 사용하여 드라이브에 존재하는 이러한 "폴더에 대한 하드 링크"수를 확인할 수 있습니다. 자세한 내용은 "hfsdebug"유틸리티에 대한 Amit의 기사를 참조하십시오.

또한 지원되는 새로운 유틸리티가 있지만 비용이 많이 듭니다. fileXray라고하며 개인 비사업용 라이센스에 대해 같은 세대의 여러 컴퓨터에서 한 사람당 79 달러의 비용이 듭니다. 이 책자에는 구입하기 전에 무엇을 할 수 있는지 확인하기 위해 다운로드 할 수있는 173 페이지의 광범위한 사용 설명서가 있습니다. 불행히도 평가판이 없으므로 설명서를 읽고 웹 사이트에서 자세한 내용을 확인하여 용지 걸림을 해결하는 데 도움이되는지 확인하십시오. 웹 사이트에서 자세한 내용을 알아보십시오. 자세한 내용은 fileXray 웹 사이트 를 참조하십시오.

이러한 하드 링크를 폴더로 사용할 때 알아야 할 몇 가지 문제가 있습니다. 볼륨이 작성된 볼륨이 원격 클라이언트에 마운트 된 경우 마운트 방법에 따라 심각한 문제점이있을 수 있습니다. AFP를 사용하여 볼륨을 원격 클라이언트에 마운트하는 경우 현재 하드 링크가 있거나 폴더가 있지만 나중에 제거한 폴더는 모든 하위 레벨 폴더로 사용할 수 없으므로 큰 문제가 있습니다 ( Finder 또는 터미널 창에서 파일에 액세스 할 수 없습니다). 간단한 "ls -lR"명령을 수행하려고하면 명령이 실패하고 모든 하위 폴더에 대해 "ls : xxx : No such file or directory"오류 메시지가 표시됩니다. Finder 윈도우를 사용하여 원격 볼륨의 디렉토리 트리를 탐색하는 경우, 폴더 이름을 처음 클릭하면 폴더에 하드 링크가 있거나 하드 링크가있는 폴더가 오류없이 사라집니다.

NFS를 사용하여 원격 클라이언트를 마운트 할 때 (및 볼륨이 로컬 HFS + 파일 시스템 인 시스템에 NFS 서버가 있다고 가정 할 경우) 이러한 오류는 오류 메시지를 제외하고는 발생하지 않는 것 같습니다. NFS를 사용하여 볼륨을 마운트하는 방법에 대한 자세한 내용은 여기에 제공되지 않습니다. 필자는 Marcel Bresink 박사의 "NFS 관리자"라는 니스 프로그램을 사용하여 서버와 클라이언트의 NFS 마운트를 지원했습니다. 그의 웹 사이트에서 얻을 수 있습니다. 즐겨 찾는 검색 엔진에서 "Bresink NFS Manager"를 검색하기 만하면 무료 평가판이 있으므로 구입하기 전에 시험해 볼 수 있습니다. NFS 마운트를 수행하는 방법을 배우고 싶다면 큰 문제는 아니지만 "NFS 관리자"를 사용하면 설정을 쉽게하고 최적화를 위해 모든 다른 설정을 조정할 수 있습니다. 그는 가격이 매우 저렴한 몇 가지 다른 깔끔한 Mac OS X 유틸리티도 가지고 있습니다. "하드웨어 모니터"는 전원 사용량, CPU 온도, 팬 속도 및 기타 여러 변수와 같은 모든 종류의 변수를 모니터링하고 그래프로 표시합니다. 장시간 (몇 분에서 몇 일까지) 로컬 및 원격 Mac 시스템. 편리한 유틸리티를 사용하고 있는지 확인하십시오.

내가 알았던 한 가지는 NFS 파일 전송이 AFP를 통해 수행하는 것보다 약 20 % 느리지 만 "마일리지가 다를 수 있으므로"어떤 식 으로든 보장 할 수는 없지만, 전혀 작동하지 않는 것과 비교하여 20 %의 성능 저하를 지불합니다.

Apple은 하드 링크 및 원격 AFP 파일 시스템의 문제점을 알고 있으며이를 AFP 클라이언트의 "구현 제한"이라고 부릅니다. 나는 그것이 실제로 보이는 것처럼 부르는 것을 선호합니다-버그! 폴더에 하드 링크를 사용할 수있는 기능이 마음에 들기 때문에 Mac OS X의 다음 릴리스에서 문제가 해결되기를 바랍니다.

이 메모는 본인의 개인적인 견해이며 정확성에 대해 어떠한 보증도하지 않으므로 귀하의 책임하에 사용하십시오. 예기치 않은 일이 발생하는 경우를 대비하여 이러한 "폴더에 대한 하드 링크"를 사용하기 전에 백업을 잘 수행하십시오. 그러나 Mac OS X의이 흥미로운 부분을 좀 더 자세히 살펴보기로한다면 재미있게 보내길 바랍니다.

49
Bob

실없는 말. 10.5에서는 맨 페이지에서 ln에 대해 알려줍니다.

   -d, -F, --directory
          allow the superuser to attempt to hard link  directories  (note:
          will  probably  fail  due  to  system restrictions, even for the
          superuser)

    Sudo  ln  -d  existing_dir  new_hard_link

비밀번호를 입력하고 아직 완료되지 않았습니다. 당신은 그것을 문서화하지 않았습니까? 당신 must 하드 링크 된 디렉토리를 문서화하십시오; 단일 사용자 컴퓨터 인 경우에도 마찬가지입니다.

삭제는 다른 이야기입니다. 디렉토리를 삭제하는 일반적인 방법으로 이동하면 내용이 삭제됩니다. 따라서 must 디렉토리를 "연결 해제"하십시오.

    unlink  new_hard_link

그곳에. 파일 시스템을 손상시키지 않기를 바랍니다!

14
Rich

Cross-posting 이 훌륭한 도구 원래 Sam :


하드 링크를 설치하려면 homebrew 을 설치했는지 확인한 후 다음을 실행하십시오.

brew install hardlink-osx

설치되면 다음을 사용하여 하드 링크를 만듭니다.

hln [source] [destination]

또한 unlink 명령이 snow leopard에서 작동하지 않음을 알았으므로 연결을 해제하는 옵션을 추가했습니다.

hln -u destination

관심있는 사람들을 위해 Github에서 코드를 사용할 수 있습니다 : https://github.com/selkhateeb/hardlink

13
Simon East

예. 커널과 파일 시스템에서 지원되지만 일반적인 용도로는 사용되지 않으므로 셸에 노출되지 않습니다.

Time Machine이 사용하는 API를 해결하고 명령 줄 도구로 래핑 할 수는 있지만 힌트를 명확하게 파악하는 것이 좋습니다.

9
Mike F

2018 년 현재는 더 이상 가능하지 않습니다. APFS (MacOS High Sierra 10.13에서 도입)는 디렉토리 하드 링크와 호환되지 않습니다. https://github.com/selkhateeb/hardlink/issues/31 참조

2
ariel

제 경우는 Windows 가상 머신에서 심볼릭 링크를 따를 수 없다는 것을 알았습니다. (Internet Explorer에서 일부 HTML 페이지를 테스트하고 싶었습니다). 그리고 내 디렉토리 구조에는 CSS 및 이미지 폴더에 대한 심볼릭 링크가 있습니다.

문제를 해결하기위한 나의 해결책은 다른 답변이 암시하는 것과는 다른 접근법이었습니다. rsync를 사용하여 폴더 사본을 작성했습니다. Rsync는 심볼릭 링크를 해결하고 대신 링크 된 파일을 복사 할 수 있습니다.

이것은 디렉토리에 대한 하드 링크를 사용하지 않고 내 문제를 해결했습니다. 작은 파일 세트로 작업하는 경우 실제로 쉬운 솔루션입니다.

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
2
Jesper Rønn-Jensen

짧은 대답은 당신이 할 수 없다는 것입니다. :) (그렇지 않아야한다고 말하는 것이 더 정확할 때 루트로 제외하십시오.)

유닉스는 모든 하위 디렉토리와 "."디렉토리에서 ".."디렉토리에 대한 링크 수만 허용합니다. 내면에서. 다른 것은 잠재적으로 매우 혼란스러운 디렉토리 트리의 레시피입니다. 이것은 명백히 Ken Thompson의 디자인 결정이었습니다.

(분명히 Apple의 Time Machine은 다음과 같이 말합니다.)

1
Penfold

Linux에서는 바인드 마운트를 사용하여 하드 링크 디렉토리를 시뮬레이션 할 수 있습니다. OSX에 대해 확실하지 않음

Sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
Sudo umount /else/dummy_but_existing_directory
1
zainengineer

이것은 아무 것도 컴파일하지 않고 내장 된 Perl (터미널에서)으로 수행 할 수도 있습니다. 내 구체적인 사용 사례는 Google 드라이브 (기호 링크를 지원하지 않음)에 대한 것이므로 아래 예는 사용 사례를 반영합니다.

'문서'폴더를 Google 드라이브에 연결하여 동기화되도록하려면 다음 단계를 따르세요.

Perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"'

Google 드라이브에서 "문서"폴더에 대한 링크를 제거하려면 다음 단계를 따르십시오.

Sudo Perl -U -e 'unlink "/Users/me/Google Drive/Documents"'

연결을 해제하려면 "루트"가 필요합니다 ( "링크 해제"perldoc 참조).

1
techiejohn

링크 된 기사에서 원본과 동일한 디렉토리에 하드 링크를 만들려고하면 해당 오류가 발생합니다. 다른 곳에서 만들어야합니다.

1
Gannet

다른 해결책은 포트를 통해 설치 가능한 bindfs https://code.google.com/p/bindfs/ 를 사용하는 것입니다.

Sudo port install bindfs
Sudo bindfs ~/source_dir ~/target_dir
0
Kit Sunde

하위 폴더가없는 경우 시도해 볼 수 있습니다

ln folder_path /*.* target_folder

그것은 OSX 10.9에서 나를 위해 일했습니다.

0
Nuray Altin