1

Некоторые утилиты 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 ответа2

1

Небольшое улучшение по сравнению с решением 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 поддерживает создание нумерованной резервной копии с source == target.

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

Все еще не совсем один вкладыш, но вы становитесь ближе к одному вызову 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 в конец строки, чтобы сохранить спокойствие, когда файл не существует.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .