cp -r
dosyaları tekrar tekrar cp -R
kopyalamak ve dizinleri tekrar tekrar kopyalamak içindir. Ancak kontrol ettim ve her ikisi de aynı şeyi hem dosyaları hem de dizinleri kopyalıyor gibi görünüyor. Peki, aslında fark nedir?
cp -r
dosyaları tekrar tekrar cp -R
kopyalamak ve dizinleri tekrar tekrar kopyalamak içindir. Ancak kontrol ettim ve her ikisi de aynı şeyi hem dosyaları hem de dizinleri kopyalıyor gibi görünüyor. Peki, aslında fark nedir?
Yanıtlar:
-R
Posix iyi tanımlanmış olsa da, -r
taşınabilir değildir!
Linux'ta, GNU ve BusyBox uygulamalarda cp
, -r
ve -R
eşdeğerdir.
Diğer tarafta, okuyabilirsiniz olarak POSIX manuel sayfasında cp
, -r
davranış olduğu uygulama tanımlı .
* 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
sembolik bağlarla gösterilen gerçek dosyaları -R
kopyalarken, çoğu zaman amaçlanan sembolik bağı kopyalayacaktır.
Aradaki fark, birinin küçük harf "R", diğeri büyük harf "R" kullanmasıdır. Bunun ötesinde, fark yok. --recursive
Uzun seçeneği kullanırsanız aynı şey .
cp
aslında bir ayrım var. Random832'nin cevabına bakınız . @Ignacio, bu cevaba " cp
modern GNU uygulaması iseniz " veya bunun gibi bir şey söyleyen bir niteleyici eklemelisiniz .
-R
sadece her zaman kullanmanın tedbirli olduğuna karar verdim ve aslında bahsettiğim sistemlerdeki bazı man sayfaları da bunu tavsiye ediyor.
Küçük -r
harf 4.1BSD'de tanıtılan daha eski bir seçenekti, bu yalnızca tüm dizinleri dosya olarak kopyalayabiliyordu. Diğer bir deyişle, bir cihazla veya FIFO ile karşılaşırsa, cihazı açar, içeriği okur ve hedefteki içerikleri içeren bir dosya oluşturur.
Büyük harf -R
standartlaştırılmış bir seçenekti (4.4BSD'de BSD'ye tanıtıldı, önceki sürümlerde bununla eşanlamlı olmasına rağmen -r
), bir cihazla karşılaştığında FIFO ya da başka bir özel dosyayla eşdeğer bir özel dosya yapacaktı.
Birçok uygulama hala bu ayrımı sürdürmektedir, ancak bir kısmı (Linux'a özgü GNU sürümü de dahil olmak üzere) yalnızca -R
semantiği -r
eşanlamlı olarak sağlamaktadır .
OS X ve FreeBSD eski sürümlerinde -r
gibidir -R -L --copy-contents
coreutils içerisinde, ya da sembolik bağları takip ve özel dosya ve FIFOların içeriğini okur.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
sembolik bağlantıyı OS X'te hedef dosyayla değiştirir, mkdir a;mkfifo a/b;cp -r a c
FIFO okunurken engellenir ve sıfırlarla mkdir a;ln -s /dev/zero a;cp -r a b
dolmaya başlar b/zero
.
Gönderen cp
OS X ve FreeBSD eski sürümlerinde adam sayfası:
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.
FreeBSD'nin yeni sürümlerinde -r
şuna eşdeğerdir -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
Tekrarlı olarak kopyalıyorsanız, herhangi bir özel dosyanın içeriğini (örneğin, FIFO'lar ve cihaz dosyaları) normal dosyadaymış gibi kopyalayın. Bu, her kaynak dosyadaki verileri okumaya çalışmak ve hedefe yazmak anlamına gelir. Normalde FIFO'lar gibi özel dosyalar ve
/dev
dizinde tipik olarak bulunanlar üzerinde istenmeyen etkileri olduğu için bu seçeneğin kullanılması genellikle bir hatadır . Çoğu durumda,cp -R --copy-contents
FIFO'lardan ve benzeri özel dosyalardan okumaya çalışırken süresiz olarak takılır ve/dev/console
kopyalamak için kullanırsanız hedef diskinizi doldurur/dev/zero
. Bu seçeneğin tekrar tekrar kopyalanmadıkça etkisi yoktur ve sembolik bağlantıların kopyalanmasını etkilemez.
aradaki farklardan biri -r gizli dizinleri kopyalarken -r gizli dizinleri kopyalamaz.
Hedef dizinde .git dizinini test ettim ve yukarıdaki sonuçlara vardım. Şu anda centOS kullanıyorum.
Yanılıyor olabilirim ama tartışmaya açık.
-r
ve -R
her ikisi de gizli dizinleri kopyalar