Линукс как копировать а не перезаписать?

222

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

Теги:
cp

6 ответов

317
Лучший ответ

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

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

Пример:

cp -n myoldfile.txt mycopiedfile.txt
  • 69
    Вместо этого используйте rsync -a -v --ignore-existing <src> <dst>
  • 0
    Решение @ Whitebird также является точным.
Показать ещё 8 комментариев
41
cp -n

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

  • 0
    -Rn ли это рекурсивно, например, с -Rn ?
38

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

rsync -a -v src dst

Но это будет обновлять файлы, если они отличаются.


Согласно комментариям

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

полностью игнорирует существующие файлы.

  • 6
    Вы хотите добавить флаг --ignore-existing чтобы предотвратить перезапись существующих файлов.
  • 6
    Завершить команду rsync -a -v --ignore-existing <src> <dst> действительно правильный ответ, вместо cp -u выше.
Показать ещё 4 комментария
31

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

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

  • 9
    OP попросил не перезаписывать существующие файлы, даже если они старше, чем скопированные файлы , поэтому -u самом деле не соответствует цели.
  • 4
    Боже мой, ты абсолютно прав. Я удивлен, что так долго никто не заметил.
22

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

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

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

  • 2
    Что тут false ?
  • 9
    @FrozenFlame Ответы -i вопросы.
Показать ещё 2 комментария
0

Ниже ответ только для одного файла: я использую 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню