it-swarm-vi.tech

Lệnh Unix để tạo một liên kết cứng đến một thư mục trong OS X là gì?

Làm thế nào để bạn tạo một liên kết cứng (trái ngược với liên kết tượng trưng hoặc bí danh Mac OS) trong OS X trỏ đến một thư mục? Tôi đã biết lệnh "ln đích đích" nhưng nó chỉ hoạt động khi mục tiêu là một tệp. Tôi biết rằng Mac OS, không giống như các môi trường Unix khác, cho phép liên kết cứng với các thư mục (ví dụ, điều này được sử dụng cho Time Machine) nhưng tôi không biết cách tự làm điều đó.

48
username

Bạn không thể làm điều đó trực tiếp trong BASH. Tuy nhiên ... Tôi đã tìm thấy một bài viết ở đây thảo luận về cách thực hiện gián tiếp: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html biên dịch một chương trình C nhỏ đơn giản:

#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;
}

... và xây dựng trong Terminal.app với:

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

Tôi đồng ý rằng các thư mục/thư mục liên kết cứng có thể gây ra sự cố nếu không cẩn thận, nhưng chúng có một lợi thế rất rõ ràng - Time Machine là một ví dụ hoàn hảo. Nếu không có chúng, điều đó chỉ đơn giản là không thực tế vì việc sao chép các phiên bản dự phòng của các tệp sẽ tiêu thụ rất nhanh ngay cả những đĩa lớn nhất.

Snow Leopard có thể tạo các liên kết cứng đến các thư mục miễn là bạn tuân theo sáu quy tắc của Amit Singh:

  1. Hệ thống tập tin phải được ghi nhật ký HFS +.
  2. Các thư mục mẹ của nguồn và đích phải khác nhau.
  3. Nguồn gốc cha mẹ không được là thư mục gốc.
  4. Đích đến không được trong thư mục gốc.
  5. Đích đến không phải là hậu duệ của nguồn.
  6. Đích đến không được có bất kỳ tổ tiên nào mà một liên kết cứng thư mục.

Vì vậy, không đúng chút nào khi Snow Leopard đã mất khả năng tạo liên kết cứng đến các thư mục.

Tôi vừa xác minh rằng liên kết/hủy liên kết hoạt động trên Snow Leopard - miễn là bạn tuân theo sáu quy tắc. Tôi vừa thử nó và nó hoạt động tốt trên hệ thống Snow Leopard 10.6.6 của tôi - đã thử nó trên ổ đĩa khởi động và trên một ổ đĩa ngoài USB riêng biệt và nó hoạt động tốt trong cả hai trường hợp.

Đây là chương trình "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

Vì vậy, hãy cẩn thận nếu bạn thử nó - hãy nhớ tuân thủ các quy tắc và sử dụng hlink để tạo các liên kết cứng này và sử dụng hunlink để xóa liên kết cứng sau đó. Và đừng quên ghi lại những gì bạn đã làm sau này hoặc cho người khác có thể cần biết điều này.

Một "gotcha" khác mà tôi vừa tìm hiểu về các "liên kết cứng" này đến các thư mục. Khi bạn tạo chúng, thực sự có rất nhiều điều xảy ra "đằng sau bức màn" của Mac OS X. Một vấn đề thực sự quan trọng là thư mục bạn tạo liên kết thực sự được chuyển đến một thư mục siêu ẩn siêu kỳ diệu có tên /.HFS+ Dữ liệu thư mục riêng% 000d/dir_xxx trong đó xxx là số inode của "source_folder" - hãy nhớ định dạng của lệnh là

hlink source_folder target_folder

Vì vậy, vì điều này, bạn phải cẩn thận không mở bất kỳ tệp nào trong "source_folder" bởi vì nếu bạn làm như vậy, chúng sẽ được chuyển đến thư mục siêu ma thuật và bạn có thể gặp sự cố nếu bạn thử và lưu bất kỳ thay đổi nào đến những tệp được mở trong "source_folder". Điều này đã xảy ra với tôi một vài lần cho đến khi nó hiểu ra những gì đang xảy ra và giải pháp khá đơn giản. Tôi nhận thấy rằng bạn không thể thực hiện lệnh "ls -la" nữa mà không gặp phải các lỗi buồn cười cho tất cả các thư mục/thư mục trong "source_folder" ban đầu nhưng bạn có thể thực hiện lệnh "ls" và tất cả đều trông ổn.

Nếu bạn chạy "Xác minh đĩa" trong chương trình "Tiện ích đĩa", bạn sẽ nhận thấy rằng nó có thể phàn nàn và đưa ra "Khối bitmap cần sửa chữa nhỏ cho các khối mồ côi", đó là điều vừa xảy ra với việc tạo thư mục siêu ma thuật và sự chuyển động của "source_folder" với nó.

Nếu bạn thấy mình trong tình huống này với "khối mồ côi", trước tiên hãy lưu các tệp đã thay đổi vào một số vị trí tạm thời khác không nằm trong ổ chứa cây "source_folder", sau đó sử dụng "Tiện ích đĩa" để ngắt kết nối và phát lại ổ chứa "source_folder" hoặc chỉ cần khởi động lại máy tính. Sau đó sao chép các tệp bạn đã lưu vào các vị trí tạm thời trở lại vị trí ban đầu của chúng và bạn sẽ quay lại công việc. Đây là những gì làm việc cho tôi, vì vậy không thể đảm bảo điều này cũng sẽ làm việc cho bạn. Vì vậy, nó có thể là một ý tưởng tốt để thử điều này trên một tập bạn có một bản sao lưu tốt chỉ trong trường hợp.

Có vẻ như rất kỳ lạ khi tất cả chi phí này xảy ra chỉ với nhiệm vụ đơn giản là tạo một liên kết cứng đến một thư mục. Có ai có ý tưởng tại sao Mac OS X nỗ lực hết mình cho việc tạo liên kết cứng này vào các thư mục không? Liệu nó có liên quan gì đến thực tế rằng đây là một hệ thống tập tin "được ghi nhật ký" không?

Tôi phát hiện ra thông tin về vị trí siêu ma thuật, siêu ẩn bằng cách đọc lời giải thích của Amit Singh về tiện ích "hfsdebug" của anh ta. Nếu bạn muốn biết thêm chi tiết, hãy xem trang web của anh ấy tại tiện ích hfsdebug của Amit Singh . Đây là một phần mềm rất thú vị và sẽ cho bạn biết nhiều chi tiết về các hệ thống tệp HFS +. Nó miễn phí và tôi khuyến khích bạn tải xuống và dùng thử. Nó không còn được hỗ trợ nhưng nó vẫn hoạt động trên cả Snow Leopard và Leopard - về cơ bản là bất kỳ hệ thống nào được hỗ trợ HFS +. Bạn thực sự không thể làm hại gì với nó vì đây là một công cụ "chỉ đọc" - vì vậy thật tuyệt khi sử dụng để xem xét một số chi tiết của hệ thống tệp.

Thêm một vấn đề nữa về các "liên kết cứng đến các thư mục" này - một khi bạn tạo một và thư mục siêu bí mật siêu bí mật được tạo ra, nó sẽ ổn. Ngay cả khi bạn hủy liên kết thư mục khiến nó được tạo ở vị trí đầu tiên, thư mục ma thuật này vẫn ở xung quanh. Không chắc chắn tại sao, nhưng nó chắc chắn làm. Bạn có thể sử dụng "hfsdebug" để tìm hiểu điều này nếu bạn muốn dùng thử. Bạn cũng có thể sử dụng "hfsdebug" để tìm hiểu có bao nhiêu "liên kết cứng đến thư mục" này tồn tại trên một ổ đĩa. Để biết các chi tiết này, hãy tham khảo bài viết của Amit về tiện ích "hfsdebug".

Anh ta cũng có một tiện ích mới hơn được hỗ trợ nhưng chi phí. Nó được gọi là fileXray và có giá 79 đô la cho một người trên bất kỳ số lượng máy tính nào trong cùng một hộ gia đình cho giấy phép loại hình kinh doanh cá nhân. Nó có Hướng dẫn sử dụng rộng 173 trang mà bạn có thể tải xuống để xem những gì nó có thể làm trước khi mua. Thật không may, không có phiên bản dùng thử, vì vậy hãy đọc hướng dẫn và kiểm tra trang web để biết thêm chi tiết để xem liệu nó có thể giúp bạn thoát khỏi tình trạng kẹt xe hay không. Tìm hiểu tất cả các chi tiết về nó tại trang web của họ - xem trang web fileXray để biết thêm thông tin.

Có một số vấn đề bạn cần lưu ý khi sử dụng các liên kết cứng này đến các thư mục. Nếu âm lượng mà chúng được tạo trên được gắn vào máy khách từ xa, có thể có vấn đề nghiêm trọng, tùy thuộc vào cách chúng được gắn. Nếu bạn sử dụng AFP để gắn âm lượng cho máy khách từ xa, sẽ có vấn đề lớn vì bất kỳ thư mục nào hiện có liên kết cứng với nó hoặc đã từng bị xóa nhưng sau đó sẽ bị xóa, sẽ không thể được sử dụng như tất cả các thư mục cấp thấp hơn ( nhưng không phải tệp) sẽ không thể truy cập được từ cửa sổ Finder hoặc Terminal. Nếu bạn cố thực hiện một lệnh "ls -lR" đơn giản, nó sẽ thất bại và cung cấp cho bạn thông báo lỗi "ls: xxx: Không có tệp hoặc thư mục như vậy" cho tất cả các thư mục cấp thấp hơn. Nếu bạn sử dụng cửa sổ Finder để duyệt qua cây thư mục của ổ đĩa từ xa, các thư mục trong thư mục có hoặc có liên kết cứng sẽ chỉ biến mất mà không có bất kỳ lỗi nào khi bạn nhấp vào tên thư mục đầu tiên.

Những vấn đề này dường như không xảy ra (ngoại trừ thông báo lỗi) nếu bạn sử dụng NFS để gắn máy khách từ xa (và giả sử bạn có máy chủ NFS trên hệ thống có âm lượng như hệ thống tệp HFS + cục bộ). Chi tiết về cách sử dụng NFS để gắn kết khối lượng không được cung cấp ở đây. Tôi đã sử dụng một chương trình Nice từ Tiến sĩ Marcel Bresink có tên là "NFS Manager" để giúp gắn kết NFS trên máy chủ và máy khách. Bạn có thể lấy nó từ trang web của anh ấy - chỉ cần tìm kiếm "Bresink NFS Manager" trong công cụ tìm kiếm yêu thích của bạn, nhưng anh ấy có phiên bản dùng thử miễn phí để bạn có thể dùng thử trước khi mua. Sẽ không phải là vấn đề lớn nếu bạn muốn tìm hiểu cách thực hiện các mount NFS, nhưng "Trình quản lý NFS" giúp dễ dàng thiết lập mọi thứ và Tweak tất cả các cài đặt khác nhau để giúp tối ưu hóa nó. Anh ta cũng có một số tiện ích Mac OS X gọn gàng khác có giá rất hợp lý - một tiện ích gọi là "Phần cứng màn hình" cho phép bạn giám sát và vẽ biểu đồ tất cả mọi thứ như sử dụng năng lượng, nhiệt độ của CPU, tốc độ của quạt và nhiều biến số khác cho cả hai các hệ thống Mac cục bộ và từ xa trong khoảng thời gian dài (từ vài phút đến vài ngày). Chắc chắn giá trị kiểm tra nếu bạn đang vào các tiện ích tiện dụng.

Một điều tôi đã nhận thấy là việc chuyển tệp NFS chậm hơn khoảng 20% ​​so với thực hiện qua AFP, nhưng "số dặm của bạn có thể thay đổi", vì vậy không đảm bảo theo cách này hay cách khác, nhưng tôi muốn có một cái gì đó hoạt động ngay cả khi tôi có để trả một cú đánh hiệu suất 20% so với việc không có gì hoạt động cả.

Apple nhận thức được các vấn đề với các liên kết cứng và hệ thống tập tin AFP từ xa và họ gọi nó là "giới hạn cấy ghép" của ứng dụng khách AFP - Tôi thích gọi nó là cái mà nó thực sự xuất hiện với tôi - MỘT BUG !!! Tôi chỉ có thể hy vọng bản phát hành tiếp theo của Mac OS X sẽ khắc phục vấn đề này, vì tôi thực sự thích có khả năng sử dụng các liên kết cứng đến các thư mục khi nó có ý nghĩa.

Những ghi chú này là quan điểm cá nhân của riêng tôi và tôi không đảm bảo về tính chính xác của chúng vì vậy hãy tự chịu rủi ro khi sử dụng chúng. Có một bản sao lưu tốt trước khi bạn chơi xung quanh với các "liên kết cứng đến các thư mục" này trong trường hợp có điều gì đó không lường trước được xảy ra. Nhưng tôi hy vọng bạn sẽ vui nếu bạn quyết định xem xét thêm một chút về khía cạnh thú vị này của Mac OS X.

49
Bob

Piffle. Vào ngày 10.5, nó cho bạn biết trong trang man cho 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)

Vì vậy, có

    Sudo  ln  -d  existing_dir  new_hard_link

Cung cấp cho nó mật khẩu của bạn và bạn chưa hoàn thành. Bạn đã không làm tài liệu cho nó, phải không? Bạn phải tài liệu thư mục liên kết cứng; ngay cả khi đó là một máy người dùng.

Xóa là một câu chuyện khác: nếu bạn thực hiện theo cách thông thường để xóa các thư mục, bạn sẽ xóa nội dung. Vì vậy, bạn phải "hủy liên kết" thư mục:

    unlink  new_hard_link

Đó Hy vọng bạn không phá hỏng hệ thống tập tin của bạn!

14
Rich

Đăng chéo công cụ tuyệt vời này giúp giải quyết vấn đề một cách gọn gàng, ban đầu được đăng bởi Sam :


Để cài đặt Hardlink, đảm bảo bạn đã cài đặt homebrew , sau đó chạy:

brew install hardlink-osx

Sau khi cài đặt, tạo một liên kết cứng với:

hln [source] [destination]

Tôi cũng nhận thấy rằng lệnh unlink không hoạt động trên báo tuyết, vì vậy tôi đã thêm một tùy chọn để hủy liên kết:

hln -u destination

Mã có sẵn trên Github cho những ai quan tâm: https://github.com/selkhateeb/hardlink

13
Simon East

Có, nó được hỗ trợ bởi kernel và hệ thống tập tin, nhưng vì nó không dành cho mục đích sử dụng chung nên nó không được tiếp xúc với Shell.

Bạn có thể có thể tìm ra API Time Machine nào sử dụng và bọc chúng trong một công cụ dòng lệnh, nhưng sẽ tốt hơn nếu lấy gợi ý và chỉ đạo rõ ràng.

9
Mike F

Phiên bản OSX của ln không thể làm điều đó, nhưng, như được đề cập trong câu trả lời khác bởi rich , có thể với phiên bản GNU của ln có sẵn trong homebrew dưới dạng gln như một phần của coreutils công thức. man gln liệt kê -d tùy chọn với cảnh báo dành riêng cho OSX được cung cấp trong câu trả lời của rich . Nói cách khác, nó không hoạt động trong mọi trường hợp. Điều gì xác định chính xác liệu nó hoạt động hay không dường như không được ghi lại ở bất cứ đâu.

Là điều kiện tiên quyết, cài đặt coreutils:

    brew install coreutils

Bây giờ bạn có thể làm:

    Sudo gln -d /original_folder /mirror_folder

[~ # ~] quan trọng [~ # ~] : Để xóa liên kết cứng bạn phải sử dụng gunlink:

    Sudo gunlink /mirror_folder

Sử dụng rm hoặc Finder cũng sẽ xóa thư mục gốc.

FYI: Công thức coreutils homebrew cung cấp các phiên bản tương thích GNU của các công cụ unix chung. Sử dụng brew list coreutils để xem danh sách đầy đủ.

6
ccpizza

Như năm 2018 không còn có thể. APFS (được giới thiệu trong MacOS High Sierra 10.13) không tương thích với các liên kết cứng thư mục. Xem https://github.com/selkhateeb/hardlink/issues/31

2
ariel

Trường hợp của tôi là tôi phát hiện ra rằng từ một máy ảo windows, tôi không thể theo các liên kết tượng trưng. (tôi muốn kiểm tra một số trang HTML trong Internet Explorer). Và cấu trúc thư mục của tôi có các liên kết tượng trưng cho các thư mục CSS và hình ảnh.

Cách giải quyết của tôi để giải quyết vấn đề là một cách tiếp cận khác với các câu trả lời khác. Tôi đã sử dụng rsync để tạo một bản sao của thư mục. Rsync có thể giải quyết các liên kết tượng trưng và sao chép các tệp được liên kết thay thế.

Điều này giải quyết vấn đề của tôi mà không sử dụng các liên kết cứng đến thư mục. Và nó thực sự là một giải pháp dễ dàng nếu bạn chỉ làm việc với một tập hợp nhỏ các tập tin.

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

Câu trả lời ngắn gọn là bạn không thể. :) (ngoại trừ có thể là root, khi nói chính xác hơn là bạn không nên.)

Unix chỉ cho phép một số lượng liên kết đến các thư mục - ".." từ bên trong tất cả các phần tử con của nó và "." từ bên trong chính nó. Bất cứ điều gì khác có khả năng là một công thức cho một cây thư mục rất bối rối. Đây là/rõ ràng là một quyết định thiết kế của Ken Thompson.

(Phải nói rằng, rõ ràng Time Machine của Apple làm được điều này :))

1
Penfold

Trong Linux, bạn có thể sử dụng liên kết gắn kết để mô phỏng các thư mục liên kết cứng. Không chắc chắn về OSX

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

Điều này cũng có thể được thực hiện với Perl tích hợp (từ Terminal) mà không cần biên dịch bất cứ thứ gì. Trường hợp sử dụng cụ thể của tôi là dành cho Google Drive (không hỗ trợ các liên kết tượng trưng), vì vậy các ví dụ bên dưới phản ánh trường hợp sử dụng.

Để liên kết thư mục "Tài liệu" của bạn với Google Drive để nó được đồng bộ hóa:

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

Để xóa liên kết đến thư mục "Tài liệu" của bạn khỏi Google Drive:

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

Bạn cần "root" để hủy liên kết (xem "hủy liên kết" perldoc).

1
techiejohn

Từ bài viết được liên kết đến, bạn sẽ gặp lỗi đó nếu bạn cố gắng tạo liên kết cứng trong cùng thư mục với bản gốc. Bạn phải tạo ra nó ở một nơi khác.

1
Gannet

Một giải pháp khác là sử dụng bindfs https://code.google.com.vn/p/bindfs/ có thể cài đặt qua cổng:

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

trong trường hợp không có thư mục phụ, bạn có thể thử

ln thư mục_path /*.* target_folder

nó hoạt động với tôi trên OSX 10.9

0
Nuray Altin