cp -L so với cp -H


45

Vấn đề

Khi sao chép tệp bằng cp -Hhoặc cp -L, tôi nhận được kết quả tương tự:

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

Câu trả lời này ở đây mô tả cả hai tùy chọn là UNLESS tương tự được sử dụng kết hợp với -R. Không dành cho tôi. Các tệp mềm khi các liên kết cứng trở thành các bản sao của các tệp mà chúng trỏ đến tại nguồn.
 

Câu hỏi :

Việc sử dụng đúng cp -Hvà là cp -Lgì? Đây có phải là hành vi dự kiến?


  Nỗ lực của tôi để giải quyết : man cpnói với tôi khá giống nhau cho cả hai lựa chọn, nhưng info cp's từ ngữ làm cho nó thậm chí nhiều hơn khó hiểu đối với tôi. Có lẽ ai đó có thể giúp tôi phá vỡ điều này một chút:

-H Nếu một đối số dòng lệnh chỉ định một liên kết tượng trưng, ​​sau đó sao chép tệp mà nó trỏ đến chứ không phải chính liên kết tượng trưng . Tuy nhiên, sao chép (bảo tồn bản chất của nó) bất kỳ liên kết tượng trưng nào gặp phải thông qua truy cập đệ quy.

Điều này nghe có vẻ mâu thuẫn với tôi: Tôi đoán rằng » bản chất của một liên kết tượng trưng « là nó chỉ ra đâu đó

-L, --dereference Thực hiện theo các liên kết tượng trưng khi sao chép từ chúng. Với tùy chọn này, cpkhông thể tạo một liên kết tượng trưng. Ví dụ: một liên kết tượng trưng (đến tệp thông thường) trong cây nguồn sẽ được sao chép sang một tệp thông thường trong cây đích.

Tôi biết rằng một liên kết tượng trưng không phải là một tệp thông thường, nhưng tôi thừa nhận rằng tôi đã quá tin vào lời giải thích này ở đây.


Chạy info cp, tìm kiếm -R. Nó nói Copy directories recursively. Nhưng bạn đang thử nghiệm với các thư mục không. Sự khác biệt là về những gì bên trong các thư mục bạn đang sao chép, không phải các đối số dòng lệnh.
Mikel

@Mikel Tôi đã thử sao chép nội dung của các thư mục và sao chép các thư mục có nội dung và nhận được kết quả khá giống nhau. Ngoài ra: Tôi ngồi khá lâu trước mặt info cpvà cố gắng tìm hiểu xem lựa chọn từ nào trong tùy chọn này thực sự có nghĩa là gì & ndash; và bài đăng này là về. Bài đăng cũng chứa từ ngữ thực tế từ info cp- do đó tôi ít nhất cũng phải mở nó;)
erch

Câu trả lời:


55

Với symlink, các công cụ có hai điều họ có thể làm:

  1. Coi symlink là một symlink ("giữ nguyên bản chất của nó") hoặc
  2. Hãy coi symlink là loại tệp mà nó trỏ tới.

Nói rằng -H"bảo tồn bản chất của nó" không phải là một mâu thuẫn. Hãy xem xét sự thay thế. Nếu bạn sử dụng -L, mọi liên kết cptìm kiếm sẽ được mở và nội dung của chúng được sao chép vào tên tệp đích. Vì vậy, nguồn là một liên kết tượng trưng, ​​nhưng bản sao của nó không phải là một liên kết tượng trưng. Vì vậy, nó "mất bản chất của nó như là một liên kết tượng trưng".

Xem xét

$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link

# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
    awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }

$ list subdir
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14   file  
-rw-rw-r-- 14   link  

Câu trả lời tuyệt vời Tôi thích cách bạn minh họa những gì các tùy chọn làm. Nó không hoàn toàn trả lời câu hỏi của tôi , đó là về việc sao chép các liên kết tượng trưng vào các thư mục anh chị em, nhưng bạn đã làm rõ rằng làm thế nào tôi có thể thực hiện một thử nghiệm nhanh để tìm hiểu. 😉
Michael Scheper

1
À, hóa ra điều tôi thực sự muốn biết là đây: superuser.com/a/138594/219388
Michael Scheper

19

Sự khác biệt trong hành vi giữa -L-Hđến khi -rđược chỉ định là tốt. cpsẽ không tạo liên kết tượng trưng trong thư mục con -L -rnhưng nếu bạn sử dụng -H -r.


cp: các tùy chọn -H, -L và -P có thể không được chỉ định với tùy chọn -r.
3z33etm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.