Линукс как копировать а не перезаписать? - PullRequest
320 голосов
/ 22 февраля 2012

Я хочу cp каталог, но я не хочу перезаписывать любые существующие файлы, даже если они старше, чем скопированные файлы.И я хочу сделать это совершенно неинтересным, так как это будет частью скрипта Crontab Bash.Есть идеи?

Ответы [ 6 ]

488 голосов
/ 22 февраля 2012

Взято со справочной страницы :

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

Пример:

cp -n myoldfile.txt mycopiedfile.txt
74 голосов
/ 16 августа 2014

Рассмотрите возможность использования rsync.

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

Согласно комментариям rsync -a -v src dst неверно, поскольку обновит существующие файлы.

48 голосов
/ 22 февраля 2012
cp -n

Это то, что вы хотите.Смотрите справочную страницу.

32 голосов
/ 04 июня 2013

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

[править] Как уже упоминалось в комментариях, это перезапишет старые файлы, поэтому не совсем то, что хотел ОП.Используйте для этого ответ ceving.

30 голосов
/ 15 ноября 2013

Это будет работать на RedHat:

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

Обновление и без перезаписи - это нечто другое.

8 голосов
/ 11 мая 2017

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

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

В приведенном выше примере, если файл env.js не существует, мы копируем env.example.js в env.js.

...