Разница между cp -r и cp -a

174

Я ищу разницу между cp -rи cp -a. Что означает «рекурсивный» в смысле копирования файлов из папки?

похотливый
источник
62
некоторые люди ищут лучшего объяснения на страницах руководства, потому что не всегда понятно, что означало описание. Мне приходилось много раз копать и тестировать / экспериментировать, чтобы выяснить, что на самом деле происходит с определенной командой. Страница руководства grep может запутать меня в любой день.
Джо
2
Я понимаю ваше разочарование, но, по моему мнению, в большинстве случаев лучший способ учиться - это тестировать и экспериментировать.
Тройной
37
ИЛИ учитесь, задавая вопросы здесь, получая ответ понятным вам способом, а затем лучше понимайте, что и как тестировать и экспериментировать. Пожалуйста, имейте в виду, что работа для вас очень часто не работает для меня и т. Д. И т. Д.
Will Lanni

Ответы:

198

Рекурсивный означает, что cpкопирует содержимое каталогов, и если в каталоге есть подкаталоги, они также копируются (рекурсивно). Без -R, cpкоманда пропускает каталоги. -rто же самое -Rв Linux, в некоторых случаях отличается от некоторых других вариантов Unix.

По умолчанию cpсоздается новый файл, который имеет такое же содержимое, что и старый файл, и те же разрешения, но ограничен umask ; копия датируется с момента ее создания и принадлежит пользователю, выполняющему ее. С помощью этой -pопции копия имеет то же время модификации, то же время доступа и те же разрешения, что и оригинал. Он также имеет того же владельца и группу, что и оригинал, если пользователь, делающий копию, имеет разрешение на создание таких файлов.

-aОпция означает , -Rи -p, плюс несколько других вариантов сохранения. Он пытается создать копию, максимально приближенную к оригиналу: то же дерево каталогов, те же типы файлов, то же содержимое, те же метаданные (время, разрешения, расширенные атрибуты и т. Д.).

жилль
источник
35
В принципе, если вы не хотите чего-то особенного, вам это никогда не понадобится, -rпотому что -a(для archive) всегда самое безопасное и, вероятно, то, что вы ожидали.
АМС
2
@ams Да, это хорошее резюме. Единственная распространенная причина для использования -r- это то, что вы используете какой-то вариант Unix, отличный от Linux, который не имеет -a, и обычно вы используете cp -rp. Или rsync -a.
Жиль
иногда разрешения позволяют -r, но не -a
DrCord
Не -r, не -R не работает в Ubuntu 18
Аркадий
16

Параметр -r или -R для «рекурсивный» означает, что он будет копировать все файлы, включая файлы внутри подпапок.

Указанная опция -a аналогична опции -dR, что означает, что она будет сохранять ссылки, а также копировать содержимое подкаталогов. Под сохранением ссылок подразумевается, что он не будет переходить по ссылкам, поскольку он рекурсивно копирует.

Джо
источник