Cp -r ve cp -R arasındaki fark (copy komutu)


60

cp -rdosyaları tekrar tekrar cp -Rkopyalamak 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?


2
Linux kılavuzlarındaki bu seçeneklerden her biri onların eşanlamlı olduklarını söylüyor. (Diğer bazı Unix varyantlarında değiller.)
Gilles 'ÇÖZÜM'

Yanıtlar:


74

-RPosix iyi tanımlanmış olsa da, -rtaşınabilir değildir!

Linux'ta, GNU ve BusyBox uygulamalarda cp, -rve -Reşdeğerdir.

Diğer tarafta, okuyabilirsiniz olarak POSIX manuel sayfasında cp, -rdavranış 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.

14
Farklılıklardan biri, örneğin OSX’te, -rsembolik bağlarla gösterilen gerçek dosyaları -Rkopyalarken, çoğu zaman amaçlanan sembolik bağı kopyalayacaktır.
nacho4d

19

Aradaki fark, birinin küçük harf "R", diğeri büyük harf "R" kullanmasıdır. Bunun ötesinde, fark yok. --recursiveUzun seçeneği kullanırsanız aynı şey .


4
Man sayfasından: -R, -r, --recursive - dizinleri yinelemeli olarak kopyala
Dave Jennings

6
@DaveJennings: Sadece bir platformda eşit oldukları için hepsinde oldukları anlamına gelmez. Bazı uygulamalarda cpaslında bir ayrım var. Random832'nin cevabına bakınız . @Ignacio, bu cevaba " cpmodern GNU uygulaması iseniz " veya bunun gibi bir şey söyleyen bir niteleyici eklemelisiniz .
Caleb

@Caleb: Soru "linux" olarak etiketlendi. Başka ne olabilir ki?
Ignacio Vazquez-Abrams

3
-R ve -r, kullandığım sistemlerin bazıları üzerinde farklı davranışlar gösteriyor (OS X, FreeBSD, BusyBox coreutils; şu anda hangileri olduğundan emin değilim). Uzun zaman önce -Rsadece her zaman kullanmanın tedbirli olduğuna karar verdim ve aslında bahsettiğim sistemlerdeki bazı man sayfaları da bunu tavsiye ediyor.
dubiousjim

17

Küçük -rharf 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 -Rstandartlaş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 -Rsemantiği -reşanlamlı olarak sağlamaktadır .


3

OS X ve FreeBSD eski sürümlerinde -rgibidir -R -L --copy-contentscoreutils 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 csembolik bağlantıyı OS X'te hedef dosyayla değiştirir, mkdir a;mkfifo a/b;cp -r a cFIFO okunurken engellenir ve sıfırlarla mkdir a;ln -s /dev/zero a;cp -r a bdolmaya başlar b/zero.

Gönderen cpOS 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 /devdizinde 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-contentsFIFO'lardan ve benzeri özel dosyalardan okumaya çalışırken süresiz olarak takılır ve /dev/consolekopyalamak 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.


-1

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.


4
Bunu CentOS 5'te göremiyorum; -rve -Rher ikisi de gizli dizinleri kopyalar
Michael Mrozek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.