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