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


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

6 267

6 ответов:

взято с на странице:

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

пример:

cp -n myoldfile.txt mycopiedfile.txt

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

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

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

cp -n

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

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

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

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

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

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

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.