Как сделать так, чтобы "cp" в OS X не удалял файлы?

1539
SkippyFlipjack

Вот лучший способ описать это:

dirA dir1 file1.txt file3.txt dirB dir1 file1.txt file2.txt 

Я хочу скопировать содержимое dirB в dirA. cp -R dirB/* dirAбудет удалять dir1и копировать файлы, в результате чего:

dirA dir1 file1.txt file2.txt 

Но я хочу объединить их (как это было бы в Windows) и в итоге:

dirA dir1 file1.txt file2.txt file3.txt 

Предложения? Я пытался ditto, но это, кажется, игнорирует рекурсивную часть и просто сбрасывает все файлы в папку верхнего уровня.

3
http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/cp.1.html - это справочная страница для cp. MDMarra 15 лет назад 0
Как Windows объединяет эти два файла с именем `file1.txt`? Arjan 15 лет назад 1
Я только что проверил cp -R на Snow Leopard, и он будет делать то, что вы хотите. Он перезапишет файлы в dirA с одинаковыми именами, но не удалит файлы. Raynet 15 лет назад 1
спасибо Raynet, я не думал, что получаю этот результат, но я проверю еще раз. проблема здесь включает подрывную деятельность. Мне нужно сбросить кучу папок / файлов в папку с управлением версиями, но для этого нужно оставить все существующие файлы, чтобы они не засоряли файлы .svn. SkippyFlipjack 15 лет назад 0

7 ответов на вопрос

5
Matt Ball

Не используйте cp. Используйте rsync .

( Apple, ссылка для разработки .)

2
alphazero

сП ли не удалять файлы.

он делает то, что перезаписывает dirA / dir1 с помощью dirB / dir1, а не просто копирует файлы в этой папке. поэтому поведение «удалить-затем-скопировать» (по сравнению со способом Windows, который заключается в объединении папок). SkippyFlipjack 15 лет назад 2
cp перезаписывает файлы. С точки зрения пользователя, это то же самое, что и удаление: перезаписанный файл больше не доступен. mouviciel 15 лет назад 1
2
Doug Harris

Используйте -iопцию для cp

 -i Cause cp to write a prompt to the standard error output before copying a file that would overwrite an existing file. If the response from the standard input begins with the character `y' or `Y', the file copy is attempted. (The -i option overrides any previous -n option.) 
Это поможет вам продвинуться вперед - по крайней мере, он остановит непреднамеренное захлопывание файлов. `rsync` - лучшая проблема с синхронизацией файлов. Doug Harris 15 лет назад 1
Я проверю rsync. проблема с -i (спасибо MarkM, я сначала проверил страницу руководства: /) в том, что я имею дело с большими деревьями каталогов и не могу подтвердить каждую перезапись. SkippyFlipjack 15 лет назад 0
1
user78571

Должен быть элегантный способ, но для быстрого взлома: удалите разрешение на запись из файлов в dir1, затем выполните cp -r.

Я не знаю, стоит ли повышать голос за простоту и хакерство или понижать голос за ... грубый хакерство. Matt Ball 15 лет назад 0
0
3498DB

Я делаю нечто подобное со скриптом экспорта. Вот команда, которую я использую:

cp -R demo_files/. demo 

Это объединит файлы в demo_files с файлами в демо. Это не должно ничего перезаписывать.

Вы * должны * использовать опцию -n, чтобы указать отсутствие перезаписи существующих файлов в целевой директории. 15 лет назад 1
0
Eric

dirA dir1 file1.txt file3.txt dirB dir1 file1.txt file2.txt

Я бы сделал это так:

$ cd dirA $ tar cf - | (cd .../dirB ; tar xf -) 

Файлы перезаписываются, каталоги - нет.

0
Grunty

Решение Erics сработало, но мне пришлось немного подправить синтаксис:

$ cd dirA $ tar -cf - ./* | (cd .../dirB ; tar -xf -)