Как мне создать пронумерованные резервные копии?

Некоторые утилиты GNU (например, mv а также cp) может создавать пронумерованные резервные копии (foo.~1~). Другие (например, wget) не могу. Я хотел бы создать пронумерованные резервные копии перед запуском инструментов, которые по умолчанию перезаписывают файлы. Вот bash функция, которая, кажется, делает то, что мне нужно:

backup(){                       # back up the file, emacs style
  file=$1
  if test -f "${file}"; then
    /bin/mv --backup=numbered "$(mktemp ${file}XXX)" "${file}"
    /bin/rm "${file}"
  fi
}

для использования, например, так:

backup foo
curl http://.... > foo

Интересно, есть ли лучший способ?

2 ответа

Небольшое улучшение по сравнению с решением OP, чтобы сделать его более полезным:

  • Работает с каталогами.
  • mktemp аргумент может нуждаться в кавычках тоже.
  • Я бы && команды, чтобы не получить сообщение об ошибке от mv если mktemp не удается и т. д.
  • Добавлена ​​опция / разделитель аргументов -- в случае имен файлов, которые начинаются с тире.
backup(){                       # back up the file, emacs style
  local file=$1
  local tmp
  if test -e "${file}"; then
    tmp=$(mktemp -- "${file}XXX") && /bin/mv --backup=numbered --no-target-dir -- "$tmp" "${file}" && /bin/rm -- "${file}"
  fi
}

КСТАТИ, cp поддерживает создание пронумерованной резервной копии с источником == target.

> cp -v --backup=t --force a a
'a' -> 'a.~4~'

По-прежнему не совсем один вкладыш, но вы становитесь ближе к одному вызову Perl вместе с его мощным e опция (т.е. выполнить часть замещения):

backup(){
    mv "$1" "$(echo $1 |perl -pe '~s|(.*?)(~([0-9]*)~)?$|print "$1~".(${3}+1)."~"|e and exit')"
}

Обратите внимание на and exit что мешает Perl напечатать соответствующий счетчик, который иначе загрязняет имя.

Вы также можете добавить 2>/dev/null до конца строки, чтобы сохранить его в тайне, когда файл не существует.

Другие вопросы по тегам