Я хочу cpкаталог, но я не хочу перезаписывать любые существующие файлы, даже если они старше, чем скопированные файлы. И я хочу сделать это абсолютно неинтерактивным, так как это будет частью скрипта Crontab Bash. Любые идеи?
Вы хотите добавить --ignore-existingфлаг, чтобы предотвратить перезапись существующих файлов.
Все работники необходимы
7
Полная команда rsync -a -v --ignore-existing <src> <dst>действительно правильный ответ, а не cp -uвыше.
Whitebird
Если предыдущая копия была прервана и скопирован только усеченный файл, я уверен, что cp -u не скопирует его повторно ... но будет ли rsync с --ignore-существующие? Наверное, нет ... так что это делает их совершенно эквивалентными, верно?
Dagelf
rsync сохраняет временную метку файла, в то время как cp использует текущее время (по моему опыту)
Stefan Diabo
1
на некоторых серверах просто нет rsync
mebada
51
cp -n
Это то, что вы хотите. Смотрите справочную страницу.
Очевидно, что эта команда не будет работать, если вы попытаетесь скопировать больше, чем файлы ARG_MAX. Чтобы обойти это дело, проверьте эту ссылку .
Мджиниус
2
Также очевидно, что эта команда не будет работать, если земля упадет на солнце.
ceving
32
Для людей, которые находят, что у них нет опции 'n' (как я в RedHat), вы можете использовать, cp -uчтобы записать файл, только если источник новее, чем существующий (или не существует).
[edit] Как уже упоминалось в комментариях, это перезапишет старые файлы, поэтому не совсем то, что хотел ОП. Используйте ответ ceving для этого.
OP попросил не перезаписывать существующие файлы, даже если они старше, чем скопированные файлы , поэтому на -uсамом деле не соответствует цели.
Эндрю Лотт
4
Боже мой, ты абсолютно прав. Я удивлен, что так долго никто не заметил.
Мрачно ...
Возможно, это не то, о чем просил OP, но это именно то, что мне нужно для моего Uberspace (Centos 7). Спасибо!
Томас Праксл
Я рад, что шесть лет назад я мог помочь :-D
...
10
Alpine Linux: ниже ответ только для случая одного файла: в Alpinecp -n не работает (и false | cp -i ...тоже), поэтому решение, работающее в моем случае, которое я нашел, это:
if[!-f env.js ];then cp env.example.js env.js;fi
В приведенном выше примере, если env.jsфайл не существует, мы копируем env.example.jsв env.js.
Ответы:
Взято из справочной страницы :
Пример:
источник
cp -n source.txt destination.txt || true
cp -n
не завершается с ошибкой, если файл существует в Ubuntu 12.04.Подумайте об использовании
rsync
.Согласно комментариям
rsync -a -v src dst
это не правильно, потому что он будет обновлять существующие файлы.источник
--ignore-existing
флаг, чтобы предотвратить перезапись существующих файлов.rsync -a -v --ignore-existing <src> <dst>
действительно правильный ответ, а неcp -u
выше.Это то, что вы хотите. Смотрите справочную страницу.
источник
Это будет работать на RedHat:
Обновление, а не перезапись это нечто другое.
источник
false
здесь делать?-i
вопросы.Для людей, которые находят, что у них нет опции 'n' (как я в RedHat), вы можете использовать,
cp -u
чтобы записать файл, только если источник новее, чем существующий (или не существует).[edit] Как уже упоминалось в комментариях, это перезапишет старые файлы, поэтому не совсем то, что хотел ОП. Используйте ответ ceving для этого.
источник
-u
самом деле не соответствует цели.Alpine Linux: ниже ответ только для случая одного файла: в Alpine
cp -n
не работает (иfalse | cp -i ...
тоже), поэтому решение, работающее в моем случае, которое я нашел, это:В приведенном выше примере, если
env.js
файл не существует, мы копируемenv.example.js
вenv.js
.источник
Некоторые версии cp не имеют опции --no-clobber . В таком случае:
источник