Я хочу cp
каталог, но я не хочу перезаписывать любые существующие файлы, даже если они старше, чем скопированные файлы. И я хочу сделать это абсолютно неинтерактивным, так как это будет частью скрипта Crontab Bash. Есть идеи?
Linux, как копировать, но не перезаписывать?
Ответ 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