it-swarm-vi.com

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

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

63
its_me

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

Trên Linux, trong các thực thi GNU và BusyBox của cp, -r-R là tương đương.

Mặt khác, như bạn có thể đọc trong POSIX trang hướng dẫn của cp, -r hành vi là được xác định 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.
76
andcoz

Chữ thường -r là 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.

Chữ hoa -R là 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 -r) sẽ gặp phải một thiết bị, FIFO hoặc tệp đặc biệt khác, 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 -R ngữ nghĩa, với -r như một từ đồng nghĩa.

19
Random832

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 --recursive tùy chọn dài.

18

Trong OS X và các phiên bản cũ của FreeBSD -r giống như -R -L --copy-contents trong coreutils, hoặc 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 c thay 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 c bị chặn khi đọc FIFO và mkdir a;ln -s /dev/zero a;cp -r a b bắt đầu điền b/zero với số không.

Từ trang man cp 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 -r tươ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ụ: các tệp FIFO và 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 lỗi, 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 /dev danh mục. Trong hầu hết các trường hợp, cp -R --copy-contents sẽ 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ư /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.

3
Lri