Perbedaan antara cp -r dan cp -R (perintah copy)

60

cp -rdimaksudkan untuk menyalin file secara rekursif, dan cp -Runtuk menyalin direktori secara rekursif. Tapi saya sudah memeriksa, dan keduanya muncul untuk menyalin file dan direktori, hal yang sama. Jadi, apa bedanya sebenarnya?

ini aku
sumber
2
Setiap penyebutan opsi-opsi ini dalam manual Linux mengatakan bahwa itu adalah sinonim. (Mereka tidak menggunakan varian unix lainnya.)
Gilles 'SO- stop being evil'

Jawaban:

74

Meskipun -Rposix didefinisikan dengan baik, -rtidak portabel!

Di Linux, dalam implementasi GNU dan BusyBox cp, -rdan -Rsetara.

Di sisi lain, seperti yang dapat Anda baca di halaman manual POSIXcp , -rperilaku didefinisikan oleh implementasi .

    * 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.
andcoz
sumber
14
Salah satu perbedaannya adalah bahwa, di OSX misalnya, -rakan menyalin file nyata yang ditunjukkan oleh tautan simbolik sementara -Rakan menyalin tautan simbolik yang memang sering dimaksudkan.
nacho4d
19

Perbedaannya adalah bahwa yang satu menggunakan huruf kecil "R" dan yang lain menggunakan huruf "R". Di luar itu, tidak ada perbedaan. Hal yang sama jika Anda menggunakan --recursiveopsi panjang.

Ignacio Vazquez-Abrams
sumber
4
Dari halaman manual: -R, -r, --recursive - salin direktori secara rekursif
Dave Jennings
6
@DaveJennings: Hanya karena mereka sama pada satu platform tidak berarti mereka semua. Pada beberapa implementasi cpsebenarnya ada perbedaan. Lihat jawaban Random832 . @Ignacio Anda harus menyertakan kualifikasi dalam jawaban ini yang mengatakan "jika Anda cpadalah implementasi GNU modern" atau sesuatu seperti itu.
Caleb
@ Caleb: Pertanyaan ini ditandai "linux". Apa lagi itu?
Ignacio Vazquez-Abrams
4
-R dan -r memberikan perilaku berbeda pada beberapa sistem yang saya gunakan (OS X, FreeBSD, BusyBox coreutils; tidak yakin yang mana pada saat ini). Saya sudah lama memutuskan bahwa sebaiknya -Rhanya menggunakan saja, dan pada kenyataannya beberapa halaman manual pada sistem yang baru saja disebutkan juga merekomendasikan hal itu.
dubiousjim
17

Huruf kecil -radalah opsi yang lebih lama, diperkenalkan pada 4.1BSD, yang hanya akan menyalin semua direktori non-file. Artinya, jika menemui perangkat atau FIFO, itu akan membukanya, membaca konten, dan membuat file di tujuan dengan konten.

Huruf besar -Radalah pilihan standar (diperkenalkan ke BSD di 4.4BSD, meskipun versi sebelumnya memilikinya sebagai sinonim -r) yang akan, pada pertemuan perangkat, FIFO, atau file khusus lainnya, membuat file khusus yang setara di tujuan.

Banyak implementasi masih mempertahankan perbedaan ini, tetapi beberapa (termasuk versi GNU khas Linux) hanya menyediakan -Rsemantik, -rsebagai sinonim.

Random832
sumber
3

Dalam OS X dan FreeBSD versi lama -rseperti -R -L --copy-contentsdi coreutils, atau mengikuti symlink dan membaca isi file khusus dan FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cmengganti symlink dengan file target di OS X, mkdir a;mkfifo a/b;cp -r a cdiblokir membaca FIFO, dan mkdir a;ln -s /dev/zero a;cp -r a bmulai mengisi b/zerodengan nol.

Dari cphalaman manual di OS X dan FreeBSD versi lama:

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.

Dalam versi baru FreeBSD -rsetara dengan -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

Jika menyalin secara rekursif, salin konten file khusus apa pun (misalnya, FIFO dan file perangkat) seolah-olah itu file biasa. Ini berarti mencoba membaca data di setiap file sumber dan menulisnya ke tujuan. Biasanya merupakan kesalahan untuk menggunakan opsi ini, karena biasanya memiliki efek yang tidak diinginkan pada file khusus seperti FIFO dan yang biasanya ditemukan dalam /devdirektori. Dalam kebanyakan kasus, cp -R --copy-contentsakan menggantung tanpa batas mencoba membaca dari FIFOs dan file khusus seperti /dev/console, dan itu akan mengisi disk tujuan Anda jika Anda menggunakannya untuk menyalin /dev/zero. Opsi ini tidak memiliki efek kecuali menyalin secara rekursif, dan itu tidak mempengaruhi penyalinan tautan simbolik.

Lri
sumber
-1

salah satu perbedaan saya menemukan bahwa -r tidak menyalin direktori tersembunyi sementara -R menyalin direktori tersembunyi.

Saya mengujinya. Direktori git di direktori target dan sampai pada kesimpulan di atas. Saya menggunakan centOS saat ini.

Saya mungkin salah tetapi terbuka untuk diskusi.

Zeel SHah
sumber
4
Saya tidak melihat ini di CentOS 5; -rdan -Rkeduanya menyalin direktori tersembunyi
Michael Mrozek