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

StackOverflow https://stackoverflow.com/questions/80875

문제

OS X에서 디렉터리를 가리키는 하드링크(심볼릭 링크나 Mac OS 별칭과 반대)를 어떻게 생성합니까?나는 이미 "ln target Destination" 명령을 알고 있지만 대상이 파일인 경우에만 작동합니다.다른 Unix 환경과 달리 Mac OS에서는 폴더에 대한 하드링크를 허용한다는 것을 알고 있지만(예를 들어 Time Machine에 사용됨) 직접 수행하는 방법은 모르겠습니다.

도움이 되었습니까?

해결책 2

그러면 BASH에서 직접 할 수 없습니다.하지만...간접적으로 수행하는 방법을 설명하는 기사를 여기에서 찾았습니다. http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html 간단한 작은 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

다른 팁

폴더/디렉터리를 하드 링크하면 주의하지 않으면 문제가 발생할 수 있다는 데 동의하지만 매우 확실한 이점이 있습니다. Time Machine이 완벽한 예입니다.그것들이 없으면 파일의 중복 버전을 복제하면 가장 큰 디스크도 매우 빨리 소비하게 되므로 실용적이지 않을 것입니다.

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

  1. 파일 시스템은 HFS+로 저널링되어야 합니다.
  2. 원본과 대상의 상위 디렉터리는 달라야 합니다.
  3. 소스의 상위 디렉터리는 루트 디렉터리가 아니어야 합니다.
  4. 대상은 루트 디렉터리에 있으면 안 됩니다.
  5. 대상은 소스의 하위 항목이 아니어야 합니다.
  6. 대상에는 디렉터리 하드 링크인 상위 항목이 없어야 합니다.

따라서 스노우 레오파드가 폴더에 대한 하드 링크를 만들 수있는 능력을 잃어버린 것은 전혀 정확하지 않습니다.

방금 링크/무제한이 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를 사용하여 하드 링크를 제거하는 것을 기억하십시오.그리고 나중에 한 일이나 이것을 알아야 할 다른 사람을 위해 당신이 한 일을 문서화하는 것을 잊지 마십시오.

폴더에 대한 이러한 "하드 링크"에 대해 방금 배운 또 다른 "알았다".Mac OS X의 "커튼 뒤에서" 정말 많은 일이 발생합니다.정말 중요한 문제 중 하나는 링크를 생성한 폴더가 실제로 /.HFS+ Private Directory Data%000d/dir_xxx라는 매우 마법 같은 숨겨진 폴더로 이동된다는 것입니다. 여기서 xxx는 "source_folder"의 inode 번호입니다. 명령의 형식은

hlink source_folder target_folder

따라서 이 때문에 "source_folder"에 파일을 열지 않도록 주의해야 합니다. 그렇게 하면 해당 파일이 슈퍼 마법 폴더로 이동되고 변경 사항을 저장하려고 하면 문제가 발생할 가능성이 높기 때문입니다. "source_folder"에 열려 있는 파일로 이동합니다.무슨 일이 일어나고 있는지 깨닫게 될 때까지 이런 일이 몇 번이나 일어났고 해결책은 매우 간단합니다.원래 "source_folder"에 있던 모든 폴더/디렉토리에 대해 이상한 오류가 발생하지 않고 "ls -la" 명령을 더 이상 수행할 수 없지만 "ls" 명령을 수행하면 모든 것이 잘 보이는 것으로 나타났습니다.

"디스크 유틸리티" 프로그램에서 "디스크 확인"을 실행하면 "볼륨 비트맵에 고아 블록에 대한 사소한 복구가 필요합니다."라는 메시지가 표시되고 슈퍼 마법 폴더 생성 시 발생한 일입니다. "source_folder"를 해당 폴더로 이동합니다.

"고아 블록"이 있는 상황에 처한 경우 먼저 변경된 파일을 "source_folder" 트리가 포함된 볼륨이 아닌 다른 임시 위치에 저장한 다음 "디스크 유틸리티"를 사용하여 해당 파일이 포함된 볼륨을 마운트 해제하고 다시 마운트하세요. "source_folder"를 사용하거나 컴퓨터를 다시 시작하세요.그런 다음 임시 위치에 저장한 파일을 원래 위치로 복사하면 다시 업무를 시작할 수 있습니다.이것이 나에게 효과가 있었기 때문에 이것이 당신에게도 효과가 있을 것이라고 보장할 수는 없습니다.따라서 만약을 대비해 백업이 잘 되어 있는 볼륨에서 이 방법을 시도해 보는 것이 좋습니다.

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

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

이러한 "폴더에 대한 하드 링크"에 대한 또 하나의 문제 - 일단 폴더를 만들고 초마법의 초비밀 폴더가 생성되면 영원히 거기에 있습니다.처음에 폴더를 생성한 폴더의 연결을 해제하더라도 이 마법 폴더는 그대로 유지됩니다.이유는 확실하지 않지만 확실히 그렇습니다.시험해보고 싶다면 "hfsdebug"를 사용하여 이를 알아낼 수 있습니다."hfsdebug"를 사용하여 드라이브에 이러한 "폴더에 대한 하드 링크"가 몇 개 있는지 확인할 수도 있습니다.자세한 내용은 "hfsdebug" 유틸리티에 대한 Amit의 기사를 참조하세요.

그는 또한 지원되지만 비용이 드는 또 다른 최신 유틸리티를 가지고 있습니다.fileXray라고 하며 개인용 비업무용 라이센스의 경우 같은 가구의 컴퓨터 수에 관계없이 한 사람이 79달러를 지불합니다.구매하기 전에 무엇을 할 수 있는지 다운로드할 수 있는 광범위한 173페이지 사용자 가이드가 있습니다.안타깝게도 평가판은 없으므로 설명서를 읽고 웹사이트에서 자세한 내용을 확인하여 문제를 해결하는 데 도움이 될 수 있는지 확인하세요.해당 웹사이트에서 자세한 내용을 알아보세요. - 참조 파일Xray 웹사이트 더 많은 정보를 위해서.

폴더에 대한 하드 링크를 사용할 때 알아야 할 몇 가지 문제가 있습니다.생성된 볼륨이 원격 클라이언트에 마운트된 경우 마운트 방법에 따라 심각한 문제가 발생할 수 있습니다.AFP를 사용하여 원격 클라이언트에 볼륨을 마운트하는 경우 현재 하드 링크가 있거나 하드 링크가 있었지만 나중에 제거된 폴더를 모든 하위 수준 폴더로 사용할 수 없으므로 큰 문제가 있습니다( 파일은 제외)은 Finder 또는 터미널 창에서 접근할 수 없습니다.간단한 "ls -lR" 명령을 실행하려고 하면 실패하고 "ls:트리플 엑스:모든 하위 수준 폴더에 해당 파일이나 디렉터리가 없습니다."라는 오류 메시지가 나타납니다.Finder 창을 사용하여 원격 볼륨의 디렉터리 트리를 탐색하는 경우 폴더 이름을 처음 클릭하면 하드 링크가 있거나 있는 폴더에 있는 폴더가 오류 없이 사라집니다.

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

내가 알아차린 한 가지는 NFS 파일 전송이 AFP를 통해 수행하는 것보다 약 20% 느리다는 것입니다. 그러나 "마일리지는 다를 수 있습니다". 따라서 어떤 식으로든 보장할 수는 없지만, 아무것도 작동하지 않는 것과 비교하여 20%의 성능 저하를 지불합니다.

Apple은 하드 링크 및 원격 AFP 파일 시스템의 문제를 알고 있으며 이를 AFP 클라이언트의 "구현 제한"이라고 부릅니다. 저는 이를 실제로 제가 보기에는 버그라고 부르는 것을 선호합니다.Mac OS X의 다음 릴리스에서는 문제가 해결되기를 바랄 뿐입니다. 필요할 때 폴더에 대한 하드 링크를 사용할 수 있는 기능이 있다는 점을 정말 좋아하기 때문입니다.

이 메모는 내 개인적인 의견이며 정확성에 대해 어떠한 보증도 하지 않으므로 책임은 본인이 감수하고 사용하시기 바랍니다.예상치 못한 일이 발생할 경우를 대비하여 이러한 "폴더에 대한 하드 링크"를 가지고 놀기 전에 잘 백업해 두십시오.하지만 Mac OS X의 흥미로운 측면을 좀 더 자세히 살펴보고 싶다면 즐거운 시간을 보내시기 바랍니다.

실없는 말.10.5에서는 매뉴얼 페이지에 다음과 같이 나와 있습니다. :

   -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

비밀번호를 알려주고 넌 아직 끝나지 않았어.당신은 그것을 문서화하지 않았죠?너 ~ 해야 하다 하드 링크된 디렉토리를 문서화하십시오.단일 사용자 컴퓨터라 하더라도 마찬가지입니다.

삭제는 다른 이야기입니다.디렉토리를 삭제하는 일반적인 방법을 사용하면 내용이 삭제됩니다.그래서 당신은 ~ 해야 하다 디렉토리를 "링크 해제"합니다:

    unlink  new_hard_link

거기.파일 시스템을 망가뜨리지 않기를 바랍니다!

교차 게시 이 훌륭한 도구 원래 게시한 문제를 깔끔하게 해결합니다. :


Hardlink를 설치하려면 다음을 설치했는지 확인하세요. 집에서 만든 맥주, 다음을 실행합니다.

brew install hardlink-osx

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

hln [source] [destination]

나는 또한 그것을 알아차렸다. unlink Snow Leopard에서는 명령이 작동하지 않으므로 연결 해제 옵션을 추가했습니다.

hln -u destination

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

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

Time Machine이 어떤 API를 사용하는지 알아내고 이를 명령줄 도구에 래핑할 수도 있지만 힌트를 얻고 명확하게 조정하는 것이 더 좋습니다.

OSX 버전의 ln 할 수는 없지만 다른 답변에서 언급했듯이 부자, GNU 버전에서는 가능합니다. ln 다음에서 사용할 수 있습니다. 집에서 만든 맥주 ~처럼 gln 의 일부로 코어 유틸리티 공식. man gln 나열 -d OSX 관련 경고가 포함된 옵션 부자님의 답변입니다.즉, 모든 경우에 작동하지는 않습니다.그것이 작동하는지 여부를 정확히 결정하는 것은 어디에도 문서화되어 있지 않은 것 같습니다.

전제 조건으로 설치 coreutils:

    brew install coreutils

이제 다음을 수행할 수 있습니다.

    sudo gln -d /original_folder /mirror_folder

중요한:하드 링크를 제거하려면 ~ 해야 하다 사용 gunlink:

    sudo gunlink /mirror_folder

사용 rm 또는 Finder는 원본 폴더도 삭제합니다.

참고:그만큼 코어 유틸리티 homebrew Formula는 일반 Unix 도구의 GNU 호환 버전을 제공합니다.사용 brew list coreutils 전체 목록을 보려면

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

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

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

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/

2018년부터는 더 이상 불가능합니다.APFS(MacOS High Sierra 10.13에 도입됨)는 디렉터리 하드링크와 호환되지 않습니다.보다 https://github.com/selkhateeb/hardlink/issues/31

짧은 대답은 할 수 없다는 것입니다.:) (하지 말아야 한다고 말하는 것이 더 정확할 경우 루트인 경우는 제외됩니다.)

Unixes는 디렉토리에 대한 정해진 수의 링크 만 허용합니다. ".."모든 어린이 내에서 "." 그 자체 내에서.다른 모든 것은 잠재적으로 매우 혼란스러운 디렉토리 트리를 만드는 방법이 될 수 있습니다.이것은 분명히 Ken Thompson의 디자인 결정이었습니다.

(그런데 Apple의 Time Machine이 이 작업을 수행하는 것 같습니다 :))

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

이는 아무것도 컴파일하지 않고 내장된 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 "링크 해제" 참조).

또 다른 해결책은 binfs를 사용하는 것입니다. https://code.google.com/p/bindfs/ 포트를 통해 설치할 수 있습니다.

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir

하위 폴더가 없으면 시도해 볼 수 있습니다

ln 폴더_경로/*.* 대상_폴더

OSX 10.9에서 저에게 효과적이었습니다.

Linux에서는 바인드 마운트를 사용하여 하드 링크 디렉터리를 시뮬레이션할 수 있습니다.OSX에 대해 잘 모르겠습니다.

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top