it-swarm-id.com

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

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

63
its_me

Sementara -R posix didefinisikan dengan baik, -r tidak portabel!

Di Linux, dalam GNU dan implementasi BusyBox dari cp, -r dan -R adalah setara.

Di sisi lain, seperti yang dapat Anda baca di POSIX halaman manual cp, -r perilaku adalah implementasi-didefinisikan .

    * 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

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

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

Banyak implementasi masih mempertahankan perbedaan ini, tetapi beberapa (termasuk versi GNU khas Linux) hanya menyediakan -R semantik, dengan -r sebagai sinonim.

19
Random832

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 --recursive opsi panjang.

18

Di OS X dan FreeBSD versi lama -r seperti -R -L --copy-contents dalam coreutils, atau mengikuti symlink dan membaca isi file khusus dan FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a c mengganti symlink dengan file target di OS X, mkdir a;mkfifo a/b;cp -r a c diblokir saat membaca FIFO, dan mkdir a;ln -s /dev/zero a;cp -r a b mulai mengisi b/zero dengan nol.

Dari halaman manual cp 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 FreeBSD baru -r setara 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 (mis., FIFO dan file perangkat) seolah-olah itu adalah 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 FIFOs dan yang biasanya ditemukan di /dev direktori. Umumnya, cp -R --copy-contents akan hang tanpa batas waktu 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 berpengaruh kecuali menyalin secara rekursif, dan itu tidak mempengaruhi penyalinan tautan simbolik.

3
Lri