Я хочу cp
каталог, но я не хочу перезаписывать любые существующие файлы, даже если они старше, чем скопированные файлы. И я хочу сделать это полностью неиактивным, так как это будет частью Crontab Bash script. Любые идеи?
Взято из справочная страница:
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
Пример:
cp -n myoldfile.txt mycopiedfile.txt
rsync -a -v --ignore-existing <src> <dst>
cp -n
Это то, что вы хотите. См. Справочную страницу.
-Rn
ли это рекурсивно, например, с -Rn
?
Рассмотрим использование rsync
.
rsync -a -v src dst
Но это будет обновлять файлы, если они отличаются.
Согласно комментариям
rsync -a -v --ignore-existing src dst
полностью игнорирует существующие файлы.
--ignore-existing
чтобы предотвратить перезапись существующих файлов.
rsync -a -v --ignore-existing <src> <dst>
действительно правильный ответ, вместо cp -u
выше.
Для людей, которые обнаруживают, что у вас нет опции "n" (например, я на RedHat), вы можете использовать cp -u
только для записи файла, если источник новее, чем существующий (или нет существующий).
[edit] Как уже упоминалось в комментариях, это будет перезаписывать старые файлы, так что это не совсем то, что хотел OP. Используйте для этого ответ ceving.
-u
самом деле не соответствует цели.
Это будет работать с RedHat:
false | cp -i source destination 2>/dev/null
Обновление и отсутствие перезаписывания - это что-то другое.
false
?
-i
вопросы.
Ниже ответ только для одного файла: я использую 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
.