3

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

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 ответов7

5

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

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

2

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

2

Используйте опцию -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.)
1

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

0

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

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

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

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

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

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

0

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

cp -R demo_files/. demo

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .