cp -rпредназначен для рекурсивного копирования файлов и рекурсивного cp -Rкопирования каталогов. Но я проверил, и оба, кажется, копируют файлы и каталоги, то же самое. Итак, какая разница на самом деле?
Каждое упоминание об этих опциях в руководствах для Linux говорит о том, что они являются синонимами. (Они не на других вариантах Unix.)
Жиль "ТАК - перестань быть злым"
Ответы:
74
Хотя -Rposix четко определен, -rон не переносим!
В Linux, в реализации GNU и BusyBox из cp, -rи -Rэквивалентны.
С другой стороны, как вы можете прочитать на странице руководства POSIXcp , -rповедение определяется реализацией .
* 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.
Одно из отличий заключается в том, что, например, в OSX -rбудут копироваться реальные файлы, на которые указывают символические ссылки, в то время как -Rбудут копироваться символические ссылки, как и предполагалось в большинстве случаев.
nacho4d
19
Разница в том, что один использует строчную букву «R», а другой - заглавную «R». Помимо этого, нет разницы. То же самое, если вы используете --recursiveдлинную опцию.
Со страницы руководства: -R, -r, --recursive - рекурсивно копировать каталоги
Dave Jennings
6
@DaveJennings: То, что они эквивалентны на одной платформе, не означает, что они есть на всех. На некоторых реализациях cpесть на самом деле различие. Смотрите ответ Random832 . @Ignacio, вы должны включить в этот ответ квалификатор, который говорит: «Если вы cp- современная реализация GNU» или что-то в этом роде.
Калеб
@Caleb: вопрос помечен как "linux". Что еще это будет?
Игнасио Васкес-Абрамс
4
-R и -r дают различное поведение в некоторых системах, которые я использую (OS X, FreeBSD, BusyBox coreutils; не знаю, какие из них в данный момент). Я давно решил, что всегда целесообразно использовать -Rтолько, и на самом деле некоторые справочные страницы в только что упомянутых системах также рекомендуют это.
dubiousjim
17
Нижний регистр -rбыл более старой опцией, введенной в 4.1BSD, которая просто копировала все не-каталоги в виде файлов. То есть, если он обнаружит устройство или FIFO, он откроет его, прочитает содержимое и создаст файл в месте назначения с содержимым.
Прописные буквы -Rбыли стандартизированной опцией (введенной в BSD в 4.4BSD, хотя в более ранних версиях она использовалась как синоним -r), которая при обнаружении устройства, FIFO или другого специального файла создавала эквивалентный специальный файл в месте назначения.
Многие реализации все еще поддерживают это различие, но некоторые (включая версию GNU, типичную для Linux) предоставляют только -Rсемантику -rв качестве синонима.
В OS X и старых версиях FreeBSD -rпохожа -R -L --copy-contentsна coreutils или следует по символическим ссылкам и читает содержимое специальных файлов и файлов FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a cзаменяет символическую ссылку целевым файлом в OS X, mkdir a;mkfifo a/b;cp -r a cблокируется чтением FIFO и mkdir a;ln -s /dev/zero a;cp -r a bначинает заполнение b/zeroнулями.
Со cpстраницы руководства в OS X и старых версиях FreeBSD:
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 -rэквивалентно -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.
При рекурсивном копировании копируйте содержимое любых специальных файлов (например, файлов FIFO и файлов устройств), как если бы они были обычными файлами. Это означает, что вы пытаетесь прочитать данные в каждом исходном файле и записать их в место назначения. Обычно использование этой опции является ошибкой, так как она обычно оказывает нежелательное влияние на специальные файлы, такие как FIFO и те, которые обычно находятся в /devкаталоге. В большинстве случаев cp -R --copy-contentsбудет зависать на неопределенное время, пытаясь прочитать из FIFO и таких специальных файлов, как /dev/console, и он заполнит ваш целевой диск, если вы используете его для копирования /dev/zero. Эта опция не имеет никакого эффекта, кроме как при рекурсивном копировании, и не влияет на копирование символических ссылок.
Ответы:
Хотя
-R
posix четко определен,-r
он не переносим!В Linux, в реализации GNU и BusyBox из
cp
,-r
и-R
эквивалентны.С другой стороны, как вы можете прочитать на странице руководства POSIX
cp
,-r
поведение определяется реализацией .источник
-r
будут копироваться реальные файлы, на которые указывают символические ссылки, в то время как-R
будут копироваться символические ссылки, как и предполагалось в большинстве случаев.Разница в том, что один использует строчную букву «R», а другой - заглавную «R». Помимо этого, нет разницы. То же самое, если вы используете
--recursive
длинную опцию.источник
cp
есть на самом деле различие. Смотрите ответ Random832 . @Ignacio, вы должны включить в этот ответ квалификатор, который говорит: «Если выcp
- современная реализация GNU» или что-то в этом роде.-R
только, и на самом деле некоторые справочные страницы в только что упомянутых системах также рекомендуют это.Нижний регистр
-r
был более старой опцией, введенной в 4.1BSD, которая просто копировала все не-каталоги в виде файлов. То есть, если он обнаружит устройство или FIFO, он откроет его, прочитает содержимое и создаст файл в месте назначения с содержимым.Прописные буквы
-R
были стандартизированной опцией (введенной в BSD в 4.4BSD, хотя в более ранних версиях она использовалась как синоним-r
), которая при обнаружении устройства, FIFO или другого специального файла создавала эквивалентный специальный файл в месте назначения.Многие реализации все еще поддерживают это различие, но некоторые (включая версию GNU, типичную для Linux) предоставляют только
-R
семантику-r
в качестве синонима.источник
В OS X и старых версиях FreeBSD
-r
похожа-R -L --copy-contents
на coreutils или следует по символическим ссылкам и читает содержимое специальных файлов и файлов FIFO.mkdir a;touch b;ln -s $PWD/b a;cp -r a c
заменяет символическую ссылку целевым файлом в OS X,mkdir a;mkfifo a/b;cp -r a c
блокируется чтением FIFO иmkdir a;ln -s /dev/zero a;cp -r a b
начинает заполнениеb/zero
нулями.Со
cp
страницы руководства в OS X и старых версиях FreeBSD:В новых версиях FreeBSD
-r
эквивалентно-RL
:http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :
источник
Я обнаружил, что одно из различий заключается в том, что -r не копирует скрытые каталоги, а -R копирует скрытые каталоги.
Я проверил каталог .git в целевой директории и пришел к выводу выше. Я использую в настоящее время CentOS.
Я могу ошибаться, но это открыто для обсуждения.
источник
-r
и-R
оба копируют скрытые каталоги