Ошибка при создании архива tar: решение проблемы с датой в имени файла

Если вы пытаетесь создать архив с датой в названии через терминал, но вместо успешного бэкапа получаете сообщение об отсутствии файла – не спешите переустанавливать систему. Скорее всего, проблема кроется в том, как вы формируете имя архива. Давайте разберёмся, почему команда вроде tar -f "backup_$(date +%D).tar.gz" -czv test2 вызывает ошибку, и как это исправить.

Почему tar не создаёт архив?

Ошибка:

tar (child): backup_02/22/25.tar.gz: Cannot open: No such file or directory

возникает не из-за отсутствия исходных файлов для архивации, а из-за некорректного имени архива. Ключевой момент здесь – символы / в названии файла.

Когда вы используете date +%D, дата выводится в формате MM/DD/YY (например, 02/22/25). Слэши система воспринимает как указание на вложенные папки. Вместо создания файла backup_02/22/25.tar.gz в текущей директории, tar пытается:

  • Создать папку backup_02
  • Внутри неё – папку 22
  • А уже там – файл 25.tar.gz

Поскольку этих директорий не существует, команда завершается с ошибкой. Tar не умеет автоматически создавать каталоги для выходного файла – только для распаковки.

Как правильно указать дату в имени архива

Чтобы избежать проблем с разделителями путей, замените слэши в формате даты на другие символы. Например:

date +%m-%d-%Y    # 02-22-2025  
date +%F          # 2025-02-22 (ISO-стандарт)  
date +%d_%m_%y    # 22_02_25

Для исходной команды лучше всего подойдёт вариант с подчёркиваниями или дефисами. Перепишем её так:

tar -czvf "backup_$(date +%m-%d-%Y).tar.gz" test2

Пояснение флагов (на всякий случай):

  • -c – создать архив (create)
  • -z – сжать через gzip
  • -v – выводить прогресс (verbose)
  • -f – указать имя файла (обязательно должно идти последним из флагов!)

Кстати, если вы забудете поставить -f перед именем файла, tar попытается записать архив в стандартный вывод – и вы получите сообщение tar: Refusing to write archive to terminal.

Дополнительные советы по работе с датами в архивах

1. Сортировка по имени. Формат %F (ГГГГ-ММ-ДД) удобен тем, что архивы автоматически сортируются в хронологическом порядке при просмотре через ls.

2. Добавление времени. Если вы делаете несколько бэкапов в день, используйте:

date +%F_%H-%M  # 2025-02-22_14-30

3. Проверка директории. Если всё же нужно сохранить слэши в имени (хотя это редко оправдано), создайте структуру каталогов заранее:

mkdir -p "backup_$(date +%D | cut -d/ -f1-2)"

Иногда ошибки возникают из-за пробелов в именах файлов. Если дата содержит пробелы (например, date +"%A %B"), оборачивайте имя в двойные кавычки – но лучше вообще избегать пробелов в именах архивов.

Экспериментируйте с форматами через date без запуска tar. Просто выполните echo "$(date +ваш_формат)", чтобы сразу увидеть, как будет выглядеть имя файла.

Если после исправления формата даты вы всё равно получаете ошибки – проверьте права на запись в текущую директорию (ls -ld .) и убедитесь, что в имени архива нет запрещённых символов вроде : или *. А ещё, случается, новички путают порядок аргументов: например, ставят -f не в конце флагов, что ломает всю команду.

Новое
Интересное