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?
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?
Jawaban:
Meskipun -R
posix didefinisikan dengan baik, -r
tidak portabel!
Di Linux, dalam implementasi GNU dan BusyBox cp
, -r
dan -R
setara.
Di sisi lain, seperti yang dapat Anda baca di halaman manual POSIXcp
, -r
perilaku 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.
-r
akan menyalin file nyata yang ditunjukkan oleh tautan simbolik sementara -R
akan menyalin tautan simbolik yang memang sering dimaksudkan.
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.
cp
sebenarnya ada perbedaan. Lihat jawaban Random832 . @Ignacio Anda harus menyertakan kualifikasi dalam jawaban ini yang mengatakan "jika Anda cp
adalah implementasi GNU modern" atau sesuatu seperti itu.
-R
hanya menggunakan saja, dan pada kenyataannya beberapa halaman manual pada sistem yang baru saja disebutkan juga merekomendasikan hal itu.
Huruf kecil -r
adalah 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 -R
adalah 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 -R
semantik, -r
sebagai sinonim.
Dalam OS X dan FreeBSD versi lama -r
seperti -R -L --copy-contents
di 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 membaca FIFO, dan mkdir a;ln -s /dev/zero a;cp -r a b
mulai mengisi b/zero
dengan nol.
Dari cp
halaman 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 -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 (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
/dev
direktori. Dalam kebanyakan kasus,cp -R --copy-contents
akan 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.
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.
-r
dan -R
keduanya menyalin direktori tersembunyi