Рекурсивная / глубокая копия каталога командной строки в Linux?

13

Каков хороший общий способ сделать рекурсивную / глубокую копию каталога в Linux, которая работает в большинстве случаев? Я использовал как простые вещи, cp -Rтак и довольно сложные cpioзаклинания. Существуют ли какие-либо существенные сильные или слабые стороны, которые заставляют вас предпочитать одно другому? Какой из них вы используете чаще всего?

Грег Маттес
источник

Ответы:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Итак, в ответ на ваш вопрос:

cp -a /foo /bar

Скопируйте все рекурсивно из каталога / foo в каталог / bar, сохранив при этом символические ссылки и файл / каталог 'mode' 'owner' & 'timestamps'.

Gareth
источник
Это, безусловно, очень простое и элегантное решение. Нашли ли вы когда-нибудь недостатки этого подхода? Распределенные файловые системы? Чрезвычайно большие копии? Считаете ли вы, что другие решения, такие как cpio, tar или rsync, более эффективны в некоторых случаях?
Грег Мэттес
1
Если не было физической ошибки, у меня никогда не было локального сбоя cp из памяти (я только делал передачи размером в ТБ) в любое место, смонтированное локально (независимо от монтирования NFS или Samba). Изучите «ИСПОЛЬЗОВАНИЕ» под справочной страницей rsync для примеров, которые вы найдете поучительными. Мой любимый: $ rsync --partial --progress --rsh = ssh --архив --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Гарет
Как я отметил выше, -a не является строго переносимым.
Мэтью Флэшен
Ну, я знаю, что busybox, GNU & BSD cp в порядке. Кроме старых коробок Unix, я никогда не видел, на что это не сработает? В действительности я не вижу смысла в этом, хотя я полностью понимаю мнение Зоредаче о том, что «всегда кажется, что работа выполняется правильно, поэтому я никогда не пытался найти замену».
Гарет
@gyaresu Пожалуйста, рассмотрите возможность разделения вашего второго комментария на другой ответ, чтобы мы могли проголосовать за него.
Грег Мэттес
6

Чаще всего я использую команду типа "cd $ srcdir; tar -c. | Tar -C $ destdir -x" . Но я также использую rsync -a $ src $ dst.

Самым большим преимуществом tar-решения является то, что это то, что мне приходилось использовать в системе много лет назад, в которой не было cpio, rsync или cp, которые копировали бы рекурсивно. Тар почти везде. Он застрял у меня на голове, потому что я часто его использовал, возможно, есть более элегантные способы. Кажется, что работа всегда выполняется правильно, поэтому я никогда не пытался найти замену.

Zoredache
источник
Мне очень нравится аргумент "вездесущность дегтя". Я владею vi по тем же причинам, хотя предпочитаю другие среды редактирования.
Грег
-R уже давно является частью стандарта ( opengroup.org/onlinepubs/009695399/utilities/cp.html ), но не -a.
Мэтью Флэшен
@Matthew Flaschen: Ваш комментарий предназначен для ответа @ gyaresu?
Грег Мэттес
Это также имеет отношение к этому, так как Zoredache сказал, что он столкнулся с системой, которая "не имела [...] cp, который будет копировать рекурсивно". В основном, -R -> переносимый, -a -> не переносимый.
Мэтью Флэшен
1
Это было в 95 году, и система работала под управлением версии Unix конца 80-х. Я не думаю, что -R был вариантом для cp, но я не уверен. Я узнал, что Tidbit читает Usenet.
Zoredache
6

Посмотрите на rsync ... Мне это нравится, потому что вы копируете меньше данных, когда обновляете две директории ... это также может работать безотказно. В простейшем виде rsync -a / src / dest

трент
источник
Это действительно хороший момент. По сути, rsync имеет возможность вычислять «diff каталога» и передавать только то, что необходимо для синхронизации каталогов. Таким образом, вы можете многократно вызывать что-то вроде rsync -a src / dest, чтобы рекурсивно «непрерывно копировать» каталоги (для правильной синхронизации требуется трейлинг / on src), тогда как cp -a src / dest так не работает. Команда cp создаст новый каталог src в dest после первого cp. Вам понадобится что-то вроде cp -au src / * dest для последующих копий.
Грег Мэттес
Другая причина, по которой мне нравится rsync, заключается в том, что вы можете передать ему флаг -P, который показывает индикатор выполнения. Это дает вам некоторое представление о том, сколько времени что-то займет
Рори
0

rsyncэто отличный инструмент. Это швейцарский армейский нож для передачи данных. Это такой простой и мощный инструмент. Как только вы начнете использовать его, вы зацепите.

Рори
источник