Введение
Представьте, что каждый день вы фотографируете растущее растение. Если называть каждую фотографию plant.jpg, новый снимок будет постоянно перезаписывать старый, и история изменений потеряется. Чтобы сохранить все фотографии, нужно называть их plant_2023-01-01.jpg, plant_2023-01-02.jpg и так далее.
Та же проблема возникает с резервными копиями системы. Если всегда записывать данные в файл с одним и тем же именем, каждая новая копия может перезаписать предыдущую и уничтожить историю, необходимую для восстановления.
В этой лабораторной работе вы научитесь автоматизировать создание таких имён. Резервные копии с отметкой времени широко применяются на практике: файлы резервных копий полезны только тогда, когда можно определить время их создания и сохранить несколько поколений копий.
Вы научитесь:
- Запрашивать у Linux текущую дату в заданном формате.
- Сохранять эту дату в «коробке» — переменной.
- Использовать дату для создания уникального файла резервной копии с отметкой времени.
Получение текущей даты
На этом этапе вы научитесь использовать команду date для форматирования текущей даты. Это первый компонент динамического имени файла.
Обычная команда date выводит текущие дату и время в длинном текстовом формате. Но для имён файлов обычно нужен компактный формат, удобный для сортировки, например YYYY-MM-DD. Linux позволяет настроить вывод с помощью символа + и кода формата после него. Код %F — это удобное сокращение для полной даты в формате «год-месяц-день».
Этот формат нужен не только для красоты. Он удобен на практике: если имена файлов имеют формат YYYY-MM-DD, их алфавитная сортировка одновременно будет хронологической.
Сначала убедитесь, что вы находитесь в каталоге проекта:
cd ~/project
Теперь запросите у системы дату в нужном формате:
date +%F
Вы должны увидеть вывод, похожий на 2023-10-27, но с фактической сегодняшней датой.
Чтобы использовать этот результат в имени файла, его нужно сохранить. Для этого применяется подстановка команды. Представьте, что команда помещается внутрь пузыря $(...). Сначала оболочка выполняет команду внутри пузыря, получает результат и заменяет пузырь этим текстом.
Подстановка команды — одна из основных возможностей оболочки, связывающая простое использование командной строки с автоматизацией. Она позволяет использовать вывод одной команды как данные для другой команды.
Попробуем сохранить дату в переменной. Переменная — это именованное хранилище данных. Мы создадим хранилище с именем current_date и поместим в него результат выполнения команды.
current_date=$(date +%F)
Важно: обратите внимание, что вокруг знака = нет пробелов. Это строгое правило оболочки. Запись variable = value завершится ошибкой, а запись variable=value будет работать.
Теперь проверим содержимое нашей «коробки». Для этого используем команду echo и поставим символ $ перед именем переменной, чтобы получить её значение:
echo $current_date
Если на экране отобразилась сегодняшняя дата, значит, вы успешно сохранили результат команды.
Создание файла резервной копии
Теперь, когда дата сохранена в переменной, мы можем использовать её для создания файла резервной копии с информативным именем.
В вашем каталоге уже подготовлен файл project_plan.txt. Убедитесь, что он существует:
ls -l project_plan.txt
Наша цель — создать копию этого файла с именем project_plan_YYYY-MM-DD.bak. Таким образом, в имени копии будет указана сегодняшняя дата.
Мы воспользуемся стандартной командой cp для копирования. Но вместо того чтобы вводить дату вручную, позволим оболочке подставить её из переменной $current_date.
Выполните следующую команду:
cp project_plan.txt "project_plan_$current_date.bak"
Оболочка видит $current_date внутри двойных кавычек и перед выполнением команды копирования заменяет эту конструкцию фактической датой, сохранённой в переменной, например 2023-10-27.
Это называется раскрытием переменной. Оболочка раскрывает переменные до запуска команды cp, поэтому команда выглядит динамической, хотя сама cp не понимает переменные оболочки.
Полезный совет: этап с переменной можно пропустить и выполнить всё одной строкой. Такой подход часто используется в сценариях автоматизации. Поместите пузырь команды $(...) непосредственно в команду cp:
cp project_plan.txt "project_plan_$(date +%F).bak"
Эта команда говорит оболочке: «Выполни команду date, вставь её результат сюда, а затем выполни команду копирования». Оба способа дают абсолютно одинаковый результат.
Проверка резервной копии
Убедимся, что всё сработало. Теперь в каталоге должны находиться два файла: исходный файл и его копия с отметкой времени.
Выведите список файлов в каталоге:
ls -l
Вы должны увидеть примерно такой результат:
-rw-rw-r-- 1 labex labex 65 Oct 27 10:00 project_plan.txt
-rw-rw-r-- 1 labex labex 65 Oct 27 10:05 project_plan_2023-10-27.bak
Обратите внимание: новая дата встроена в имя файла.
Наконец, проверим, что содержимое копии не повреждено. Для чтения нового файла можно использовать команду cat. Поскольку повторно вводить полную дату может быть неудобно, снова применим подстановку команды:
cat project_plan_$(date +%F).bak
Вы должны увидеть исходный текст:
Phase 1: Initialization
Phase 2: Development
Phase 3: Deployment
Готово! Вы создали резервную копию с отметкой времени. Если завтра выполнить ту же команду, будет создан новый файл с завтрашней датой, а история резервных копий останется сохранённой и упорядоченной.
Эта простая привычка именовать файлы оказывается полезной во многих сценариях. Многие схемы ротации резервных копий начинаются именно с этой идеи: закодировать время в имени файла, чтобы сохранять несколько поколений копий, а не перезаписывать последнюю.
Итоги
Поздравляем! Вы освоили важный навык автоматизации.
В этой лабораторной работе вы научились:
- Форматировать время: использовать
date +%F, чтобы получать строку даты в удобном для компьютера формате. - Применять подстановку команды: использовать
$(...), чтобы передавать результат одной команды другой. - Создавать динамические имена: формировать имена файлов на основе текущей даты.
Этот простой приём лежит в основе профессиональных стратегий резервного копирования. Теперь вы сможете защитить файлы от случайной перезаписи!



