cp -r
có 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ì?
cp -r
có 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ì?
Câu trả lời:
Trong khi -R
posix được xác định rõ, -r
không phải là di động!
Trên Linux, trong các triển khai GNU và BusyBox cp
, -r
và -R
tương đương nhau.
Mặt khác, như bạn có thể đọc trong trang hướng dẫn POSIXcp
, -r
hà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.
-r
sẽ 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 -R
sẽ 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.
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.
cp
thự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 cp
là triển khai GNU hiện đại" hoặc đại loại như thế.
-R
chỉ 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 đó.
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.
Uppercase -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 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 -R
ngữ nghĩa, với -r
tư cách là một từ đồng nghĩa.
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ó 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 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ào số không.
Từ cp
trang 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 -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ụ: 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
/dev
thư 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ư 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.
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.
-r
và -R
cả hai sao chép các thư mục ẩn