Linux, как копировать, но не перезаписывать?

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

Ответ 1

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

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

Пример:

cp -n myoldfile.txt mycopiedfile.txt

Ответ 2

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

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

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

Ответ 3

cp -n

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Некоторые версии cp не имеют опции --no-clobber. В таком случае:

  echo n | cp -vipr src/* dst