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