Написание скриптовых файлов на Bash

Написание скриптовых файлов на Bash #

Простой скрипт на манипулирование файлами #

Скрипт должен выполнять действия из практики по манипулированию файлами:

  1. Создайте каталог playground в домашнем каталоге пользователя.
  2. Внутри данного каталога создайте каталоги dir1 и dir2.
  3. Скопируйте файл /etc/passwd в созданный каталог playground.
  4. Повторите последнюю операцию, использовав параметр -v.
  5. Повторите последнюю операцию, использовав параметр -i.
  6. Переименуйте файл passwd в fun.
  7. Переместите файл fun в каталог dir1.
  8. Переместите файл fun в каталог dir2.
  9. Переместите файл fun в каталог dir1.
  10. Переместите каталог dir1 в каталог dir2.
  11. Верните каталог dir1 и файл fun в каталог playground.
  12. Удалите каталог playground.

Создание резервных копий #

Создайте скрипт, который будет создавать резервные копии нужной информации.

Создайте следующую структуру каталогов. info, backup и data являются каталогами.

info
├── backup/
├── data/
└── make-backup.sh

Предполагается, что запуск скрипта make-backup.sh будет происходить из каталога info. При каждом запуске должно происходить следующее:

  1. В каталоге bakcup должен создаваться каталог с текущей датой и временем. Например: 2020-10-25-15-35-16.
  2. В созданный каталог должны помещаться все данные из каталога data.

Для получения информации о текущей дате используйте приложение date. Вам необходимо передать нужный формат данных.

Запуск из любой директории #

Доработайте скрипт таким образом, чтобы его можно было запускать из любого каталога. В этом режиме мы считаем, что каталоги data и backup находятся в том же каталоге, в котором находится скрипт.

Т.е. работа скрипта должна быть корректной, если он запускается из каталога info: ./make-backup.sh, так и из родительского каталога: ./info/make-backup.sh.

Для получения пути к каталогу, в котором находится скриптовый файл используйте приложение dirname. Ему потребуется путь к файлу скрипта, который указан в позиционном аргументе 0: $0.

Возможность указания каталога для резервных копий #

Доработайте скрипт таким образом, чтобы пользователь мог указать путь к каталогу, в котором следует размещать резервные копии. Если каталог пользователем не был указан, тогда должен использоваться каталог backup, который находится рядом со скриптом.

В качестве финальной проверки качества работы скрипта

  1. Создайте каталог ~/important data backups, с пробелами в названии.
  2. Запустите скрипт ./make-backup.sh ~/important\ data\ backups.

Проверка качества скрипта #

Установите приложение shellcheck, проверьте написанный скрипт и исправьте все ошибки в нём.

Задача. Расширение относительного пути к файлу #

Напишите скрипт, который принимает в качестве аргумента относительный путь к файлу или каталогу. В результате своей работы скрипт должен выводить на стандартный поток вывода абсолютный путь.

Для решения задачи предлагается использовать следующие приложения:

  • dirname
  • basename
  • pwd

Учтите, что приложение должно корректно обрабатывать пути, имеющие пробелы в названии каталогов.

Задача. Архивирование резервных копий #

Доработайте последний скрипт из предыдущей практической работы. Каталог для резервных копий должен содержать tar-архивы. Данные архивы не сжимают информацию, а только собирают файлы внутрь одного архива. Архив должен содержать каталог с резервными данными.

Ранее при выполнении backup.sh структура каталогов выглядела так:

$ tree -F info
info
├── backups/
│   └── 2020-10-25-15-36-57/
│       └── info.md
└── data/
    └── info.md

После внесения изменений каталог должен выглядеть так:

$ tree -F info
info
├── backups/
│   └── 2020-10-25-15-36-57.tar
└── data/
    └── info.md

В архиве 2020-10-25-15-36-57.tar должен находиться каталог 2020-10-25-15-36-57:

$ tar tf info/backups/2020-10-25-15-36-57.tar
2020-10-25-15-36-57/
2020-10-25-15-36-57/info.md

Не забудьте проверить скрипт с помощью ShellCheck.

Задача. Выполнение сжатия созданного архива #

tar-архивы только собирают внутри себя данных, но их сжатие не происходит по умолчанию. Доработайте скрипт, чтобы он выполнял сжатие данных.

Для сжатия данных используйте одно из следующих приложений:

  • bzip2
  • gzip
  • xz

После выполнения скрипта структура каталога должна выглядеть следующим образом:

$ tree -F info
info
├── backups/
│   └── 2020-10-25-15-36-57.tar.xz
└── data/
    └── info.md

Расширение файла должно соответствовать средству, которое использовалось для создания архива

  • bzip2: .tar.bz2
  • gzip: .tar.gz, .tgz
  • xz: .tar.xz, txz

Не забудьте проверить скрипт с помощью ShellCheck.

Задача. Использование tar для архивирования и сжатия файлов #

Приложение tar позволяет одновременно собирать приложения в архив с последующим сжатием с помощью соответствующих приложений. Измените скрипт таким образом, чтобы tar и создавал архив и сжимал его. Необходимую информацию получите в руководстве tar.

Не забудьте проверить скрипт с помощью ShellCheck.

Задача. Создание скрипта для восстановления информации #

Создайте скрипт restore.sh. Данный скрипт должен иметь следующую сигнатуру:

./restore.sh --archive ARCHIVE --destination PATH

  --archive ARCHIVE  path to the backup archive
  --destination PATH path to the directory to put the archive contents

С помощью аргумента --archive указывается путь к архиву, который надо использовать.

С помощью аргумента --destination указывается путь к каталогу, в котором следует развернуть содержимое архива. Перед разворачиванием архива целевой каталог должен быть очищен от содержимого.

Проверьте написанный скрипт с помощью ShellCheck.

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su