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

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

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, но это, кажется, игнорирует рекурсивную часть и просто сбрасывает все файлы в папку верхнего уровня.

7 ответов

Решение

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

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

cp не удаляет файлы.

Использование -i option to 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.)

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

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

cp -R demo_files/. demo

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

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

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

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

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

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

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

Другие вопросы по тегам