Як скопіювати, але не перезаписати 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.