Мне нужна команда, которая справляется автоматически с именованием файлов в целях резервирования. Например, мне назвали файл test.txt
, и иногда я вручную должен обновить тот файл, назвав сценарий удара, который "повторно вычисляет" test.txt
.
Я обычно, прежде, чем назвать тот сценарий удара, я вручную делаю копию файла с форматом как:
cp test.txt test.txt.bk.x
где x
количество последнего резервного копирования + 1.
Я хотел бы поместить команду в начале своего сценария удара как:
backup_cp -options_about_backup_filename_format test.txt
это справляется автоматически с именованием следующего файла резервной копии. Я не должен повиноваться текущему шаблону именования файла, это мог быть любой последовательный формат, например, как файлы журнала в /var/log
где резервное копирование n. 1 всегда последнее резервное копирование, или как текущее, где резервные числа находятся в растущем порядке.
Это было бы потрясающим, если команда могла бы также стереть резервные копии oldests автоматически.
Смотрите на logrotate
команда. Вы указываете с файлом конфигурации, как скопировать более старую версию. Затем Вы звонили бы:
logrotate -f config_file
Простой пример файла конфигурации был бы:
/path/to/text.txt {
rotate 10
}
У Вас есть много других опций как: dateext, поствращайтесь, предварительно вращайтесь и т.д.
С dateext дата добавляется в конце имени файла, таким образом, Вы знаете, когда резервное копирование было создано. Сообщение/Пред вращается, может выполнить некоторые задачи прежде и после резервного копирования.
При использовании числа, это немного отличается, поскольку Вы привыкли к. 1 последний файл, и возраст растет с числом.
Не вставляйте файл конфигурации /etc/logrotate.d/
, потому что logrotate выполняет автоматически файлы конфигурации из того каталога. Вы хотите выполнить его только, когда Вы хотите и предоставляете файл конфигурации к logrotate.
Вы можете просто сгенерировать число, а затем продолжить его и записать в файл.
Например,
#!/bin/bash
IDFILE="/path/to/file/.id_number"
ID=`cat $IDFILE`
#New ID for the next one
echo $[ID + 1] > $IDFILE
Создайте файл .id_number
с номером в качестве содержания, с которого вы хотите начать, и вы можете начать его использовать.
Я создал bash-скрипт, который может справиться с подобной задачей.
Сценарий содержит
Сценарий создаст резервную копию файла target
или каталог . Также он может обрабатывать несколько каталогов файлов и (или) . Имя нового файла (или нового каталога ) будет target.N
, где N
- порядковый номер резервной копии.
У скрипта есть две опции:
--backup-chain=<chain name>
- эта опция добавит строку <chain name>
к имени файла резервной копии, и нумерация этой цепочки будет быть независимым от других цепей.
--verbose-mode
- эта опция добавит -v
к списку cp
опций команды.
Здесь представлено несколько примеров использования: https://paste.ubuntu.com/25847541/
Настройка
1. Создайте исполняемый файл сценария под названием sbcp
( простая резервная копия ), который находится в /usr/local/bin
и доступен как команда оболочки:
sudo touch /usr/local/bin/sbcp
sudo chmod +x /usr/local/bin/sbcp
sudo nano /usr/local/bin/spcp
2. [ 1139] Содержание сценария sbcp
:
#!/bin/bash
# simple backup copy - sbcp
# Compose the info message - ref: https://askubuntu.com/a/583445/566421
info_message() {
printf "Please set target - one or more file or directory: \e[33msbcp 'file1' 'file2' 'dir1/file3' 'dir2'\e[0m\n"
printf "Use the option \e[33m--backup-chain='chain name'\e[0m or \e[33m--backup-chain=chain_name\e[0m to create different backup chains.\n"
printf "Use '\e[33msbcp *\e[0m' to make a backup copy for all items in the current directory, non recursively.\n"
}
# If the STDIN is not empty, then do the operations, else just output the info message
if [ ! -z "${@+x}" ]; then
# Check whether there options are set - this should be more elegant
for item in "$@"; do
# Find the backup chain name
if [[ "$item" =~ --backup-chain=.* ]]; then
BC="$(echo "${item}" | sed -e 's/--backup-chain=//' -e 's/\"//g' -e "s/'//g")"
[[ -z "$BC" ]] && BC="$BC" || BC=".$BC"
fi
# Check whether the option --backup-chain os set
if [[ "$item" =~ --verbose-mode.* ]]; then cp_options="-pvir"; else cp_options="-pir"; fi
done
# Check whether there are other input parameters different than the option --backup-chain, if there is not - output the info message and exit
if [ "$(echo "$@" | sed -e 's/--backup-chain=/./' -e 's/\"//g' -e "s/'//g")" == "${BC}" ]; then info_message && exit 1; fi
# Output the backup chain name
[[ -z "$BC" ]] && echo "Backup chain: .N" || echo "Backup chain: ${BC}.N"
# The main part - create backup copies
for item in "$@"; do
if [[ ! "$item" =~ --backup-chain=.* ]] && [[ ! "$item" =~ --verbose-mode.* ]]; then
LAST="$(ls -1d "${item}${BC}".* 2>/dev/null | awk -F'.' '{print $(NF)}' | grep -Po '[0-9]+' | sort | tail -n1)"
cp "$cp_options" "${item}" "${item}${BC}.$((LAST+1))"
fi
done
else
info_message
fi