Як скопіювати, але не перезаписати Linux?


385

Я хочу cpв каталог, але я не хочу перезаписувати жодні існуючі файли, навіть якщо вони старіші за скопійовані файли. І я хочу зробити це зовсім неінтерактивно, оскільки це буде частиною сценарію Crontab Bash. Будь-які ідеї?


Відповіді:


589

Зі сторінки чоловіка :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Приклад:

cp -n myoldfile.txt mycopiedfile.txt

32
Зауважте, що файл вийде з помилкою, якщо файл існує. Щоб вийти з успіху, спробуйте cp -n source.txt destination.txt || true
— galenandrew

13
@galenandrew cp -nне виходить із помилкою, якщо файл існує на Ubuntu 12.04.
— amit

@galenandrew підтверджено. Дякую. Мій проект не будувався в Xcode після додавання сценарію запуску до моєї цілі.
— Руїз

@AaronFranke виглядає так, як це робиться.
— Борис

93

Подумайте про використання rsync.

rsync -a -v --ignore-existing src dst

Згідно з коментарями, rsync -a -v src dstце невірно, оскільки воно буде оновлювати наявні файли.


7
Ви хочете додати --ignore-existingпрапор, щоб запобігти перезапису існуючих файлів.
— Усі працівники є найважливішими

7
Повна команда rsync -a -v --ignore-existing <src> <dst>- це справді правильна відповідь, а не cp -uвище.
— Біла пташка

Якщо попередня копія була перервана і скопійований лише усічений файл, я впевнений, що cp -u не скопіює її повторно ... але чи буде rsync з --ignore-існуючим? Напевно, не так ... так що робить їх ідеально рівнозначними, правда?
— dagelf

rsync зберігає часову позначку файлу, коли cp використовує поточний час (на мій досвід)
— Стефан Діабо

1
у деяких серверів просто немає rsync
— mebada

51
cp -n

Це те, що ти хочеш. Дивіться сторінку чоловіка.


@AaronFranke так, це працюватиме рекурсивно.
— Борис

33

Це буде працювати над RedHat:

false | cp -i source destination 2>/dev/null

Оновлення та не перезапис - це щось інше.


4
Що falseтут роблять?
— Заморожене полум'я

11
@FrozenFlame Відповідає на -iпитання.
— закінчення

Очевидно, що ця команда не буде працювати, якщо ви спробуєте скопіювати більше ARG_MAX файлів. Щоб вирішити цю справу, перевірте це посилання .
— mginius

2
Очевидно також, що ця команда не буде працювати, якщо земля впаде на сонце.
— припинення

32

Для людей, які виявили, що у них немає опції 'n' (як, наприклад, у RedHat), ви можете використовувати cp -uфайл лише для запису файлу, якщо джерело є новим, ніж існуюче (або його немає).

[редагувати] Як згадувалося в коментарях, це перезаписує старіші файли, тож не зовсім те, що хотіла ОП Використовуйте для цього відповідь Севінга.


11
ОП попросили не перезаписувати наявні файли, навіть якщо вони старші, ніж скопійовані файли , тому -uнасправді не відповідає цілі.
— Ендрю Лотт

4
Боже, ти абсолютно прав. Я здивований, що пройшло так багато часу, щоб хтось помітив.
— Грім ...

Це може бути не те, про що вимагала ОП, але це саме те, що мені потрібно для мого Uberspace (Centos 7). Дякую!
— Thomas Praxl

Я радий, шість років тому мені могли допомогти :-D
— Grim ...

10

Alpine Linux: Нижче відповідь тільки для випадку одного файлу: в альпійському cp -nне працює (і false | cp -i ...теж) , так що рішення працює в моєму випадку , що я знайшов:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

У наведеному вище прикладі , якщо env.jsфайл не існує , то ми копіюємо env.example.jsв env.js.


1

У деяких версіях cp немає опції --no-clobber . В такому разі:

  echo n | cp -vipr src/* dst
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.