Sự khác biệt giữa cp -r và cp -R (lệnh sao chép)


60

cp -rcó nghĩa là sao chép các tệp đệ quy và cp -Rđể sao chép các thư mục đệ quy. Nhưng tôi đã kiểm tra và cả hai dường như sao chép cả tệp và thư mục, điều tương tự. Vì vậy, sự khác biệt thực sự là gì?


2
Mỗi đề cập đến các tùy chọn này trong hướng dẫn sử dụng Linux đều nói rằng chúng là từ đồng nghĩa. (Chúng không phải trên một số biến thể unix khác.)
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


74

Trong khi -Rposix được xác định rõ, -rkhông phải là di động!

Trên Linux, trong các triển khai GNU và BusyBox cp, -r-Rtương đương nhau.

Mặt khác, như bạn có thể đọc trong trang hướng dẫn POSIXcp , -rhành vi được xác định theo thực hiện .

    * If  neither  the  -R  nor  -r  options were specified, cp shall take
      actions based on the type and contents of the file referenced by the
      symbolic link, and not by the symbolic link itself.

    * If the -R option was specified:

       * If  none  of  the  options  -H,  -L, nor -P were specified, it is
         unspecified which of -H, -L, or -P will be used as a default.

       * If the -H option was specified, cp shall take  actions based on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand.

       * If the -L option was specified, cp shall take  actions based  on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand or any symbolic links encoun-
         tered during traversal of a file hierarchy.

       * If  the  -P option was specified, cp shall copy any symbolic link
         specified as a source_file operand and any symbolic links encoun-
         tered  during traversal of a file hierarchy, and shall not follow
         any symbolic links.

    * If the -r option was  specified,  the  behavior  is implementation-
      defined.

14
Một trong những khác biệt là, ví dụ, trong OSX, -rsẽ sao chép các tệp thực được trỏ bởi các liên kết tượng trưng trong khi -Rsẽ sao chép liên kết tượng trưng đó là mục đích của nó hầu hết mọi lúc.
nacho4d

19

Sự khác biệt là một cái sử dụng chữ thường "R" và cái còn lại sử dụng chữ "R" viết hoa. Ngoài ra, không có sự khác biệt. Điều tương tự nếu bạn sử dụng --recursivetùy chọn dài.


4
Từ trang man: -R, -r, --recursive - sao chép các thư mục đệ quy
Dave Jennings

6
@DaveJennings: Chỉ vì họ tương đương trên một nền tảng không có nghĩa là họ ở trên tất cả. Trên một số triển khai cpthực sự có một sự khác biệt. Xem câu trả lời của Random832 . @Ignacio bạn nên bao gồm một vòng loại trong câu trả lời này có nội dung "nếu bạn cplà triển khai GNU hiện đại" hoặc đại loại như thế.
Caleb

@Caleb: Câu hỏi được gắn thẻ "linux". Nó sẽ là gì khác?
Ignacio Vazquez-Abrams

3
-R và -r đưa ra các hành vi khác nhau trên một số hệ thống tôi sử dụng (OS X, FreeBSD, BusyBox coreutils; không chắc chắn những hệ thống nào tại thời điểm này). Tôi đã quyết định từ lâu rằng -Rchỉ nên sử dụng một cách thận trọng và trên thực tế, một số trang người đàn ông trên các hệ thống vừa được đề cập cũng khuyến nghị điều đó.
dubiousjim

17

Chữ thường -rlà một tùy chọn cũ hơn, được giới thiệu trong 4.1BSD, đơn giản sẽ sao chép tất cả các thư mục không phải là tệp. Đó là, nếu nó gặp phải một thiết bị hoặc FIFO, nó sẽ mở nó, đọc nội dung và tạo một tệp tại đích với nội dung.

Uppercase -Rlà một tùy chọn được tiêu chuẩn hóa (được giới thiệu cho BSD trong 4.4BSD, mặc dù các phiên bản trước đó có từ đồng nghĩa với nó -r), khi gặp một thiết bị, FIFO hoặc tệp đặc biệt khác, sẽ tạo một tệp đặc biệt tương đương tại đích.

Nhiều triển khai vẫn duy trì sự khác biệt này, nhưng một số (bao gồm cả phiên bản GNU điển hình cho Linux) chỉ cung cấp -Rngữ nghĩa, với -rtư cách là một từ đồng nghĩa.


3

Trong OS X và các phiên bản cũ của FreeBSD -rgiống như -R -L --copy-contentstrong coreutils, hoặc nó tuân theo các liên kết tượng trưng và đọc nội dung của các tệp đặc biệt và FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cthay thế liên kết tượng trưng bằng tệp đích trong OS X, mkdir a;mkfifo a/b;cp -r a cbị chặn khi đọc FIFO và mkdir a;ln -s /dev/zero a;cp -r a bbắt đầu điền b/zerovào số không.

Từ cptrang man trong OS X và các phiên bản cũ của FreeBSD:

Historic versions of the cp utility had a -r option.  This implementation
supports that option; however, its use is strongly discouraged, as it
does not correctly copy special files, symbolic links, or fifo's.

Trong các phiên bản mới của FreeBSD -rtương đương với -RL:

Historic versions of the cp utility had a -r option.  This  implementation
supports that option, however, its  behavior is different from historical
FreeBSD behavior.   Use of this option is strongly discouraged as the
behavior is implementation-dependent.  In FreeBSD,  -r is a synonym for
-RL and works the same unless modified by other flags.  Historical  imple-
mentations  of -r differ as they copy special files as normal files while
recreating  a hierarchy.

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :

--copy-contents

Nếu sao chép đệ quy, hãy sao chép nội dung của bất kỳ tệp đặc biệt nào (ví dụ: tệp FIFO và tệp thiết bị) như thể chúng là các tệp thông thường. Điều này có nghĩa là cố gắng đọc dữ liệu trong mỗi tệp nguồn và ghi nó đến đích. Việc sử dụng tùy chọn này thường là một sai lầm, vì nó thường có tác dụng không mong muốn đối với các tệp đặc biệt như FIFO và các tệp thường được tìm thấy trong /devthư mục. Trong hầu hết các trường hợp, cp -R --copy-contentssẽ treo vô thời hạn cố gắng đọc từ các bộ xếp hình và các tệp đặc biệt như thế /dev/console, và nó sẽ lấp đầy đĩa đích của bạn nếu bạn sử dụng nó để sao chép /dev/zero. Tùy chọn này không có hiệu lực trừ khi sao chép đệ quy và nó không ảnh hưởng đến việc sao chép các liên kết tượng trưng.


-1

một trong những khác biệt tôi thấy rằng -r không sao chép các thư mục ẩn trong khi -R sao chép các thư mục ẩn.

Tôi đã thử nó .git thư mục trong thư mục đích và đi đến kết luận trên. Tôi đang sử dụng centOS hiện tại.

Tôi có thể sai nhưng nó mở để thảo luận.


4
Tôi không thấy điều này trên CentOS 5; -r-Rcả hai sao chép các thư mục ẩn
Michael Mrozek
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.