Толик Панков
hex_laden
............ .................. ................
November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Толик Панков [userpic]
Простой скрипт, добавляющий текущий каталог в архив.

Задача


1. Добавить текущий каталог в архив со всеми подкаталогами и файлами.
Т.е., если вы находитесь в каталоге /home/user/directory, то скрипт должен добавить в архив сам каталог, и все содержимое.
2. Добавить только содержимое (т.е. в архиве присутствует только содержимое каталога, но не сам каталог).
3. Вывод справки об использовании скрипта по ключу -h или --help

Ход мысли (описание алгоритма)


Чтобы заархивировать текущий каталог разными способами, надо добавить параметр. Пусть скрипт, запущенный без параметров, архивирует текущий каталог вместе с ним самим, а скрипт, запущенный с параметром -nc (no catalog), архивирует только содержимое. Еще надо вывести помощь, а если подсунули какой-то другой параметр, то отругаться и вывести помощь.
Уточнение. Архив, из-за алгоритма работы архиватора, не сможет находиться в текущем каталоге, вне зависимости от того, с самим каталогом создается архив, или без. Архив надо создать в каталоге уровнем выше, а соответственно, предусмотреть ситуацию, когда пользователь вызывает скрипт из корневого каталога (выше него нет ничего).
Уточнение #2. Поскольку, про имя архива ничего не сказано, имя архива будет текущий_каталог.tar.gz

Решение


1. Поскольку, помощь будет вызываться в двух случаях, напишем отдельную функцию, чтоб вызывать помощь, когда нужно:

print_help()
{
    echo "Add current directory and subdirectories to tar.gz archive"
    echo "Use "`basename $0`" [-nc]"
    echo "[-nc] - add only content current directory (and subdirectories)."
    echo
    echo "Archive name == current directory name."
    echo "Archive will be created to up-directory."
    exit 1
}


2. Проверяем вызов помощи пользователем (в параметрах скрипта задано -h или --help):

if [[ "$1" == "-h" || "$1" == "--help" ]]; then
    print_help
fi


3. Проверяем, не запущен ли скрипт в корневом каталоге (/):

CURDIR=`pwd`

if [ "$CURDIR" == "/" ]; then
    echo "Oh, no! It's root directory!"
    exit 1
fi


Пояснение: `` обратные кавычки - те, которые, на клавише Ё, отправляют вывод работы команды в переменную. pwd выводит текущую директорию

4. Формируем имя архива и путь к нему и получаем имя текущего каталога

DIRNAME=`basename $CURDIR`
ARHNAME="../"$DIRNAME".tar.gz"


Пояснение: команда basename без дополнительных параметров, отрезает весь путь от имени файла, т.е. выводит на консоль только имя файла без относительного или абсолютного пути.

5. Если скрипту не заданы аргументы:

if [ $# -ne 1 ]; then

Пояснение: системная переменная $# хранит количество аргументов скрипта, заданных в командной строке.
запускаем архиватор, для создания архива вместе с текущим каталогом:

tar -czvf $ARHNAME "../"$DIRNAME

Пояснение: tar сам обрежет символы ../ и добавит, что надо.

6. Если параметр #1 скрипта присутствует, то проверяется, равен ли он -nc.

else
    if [ "$1" == "-nc" ]; then


7. Если да, вызывается архиватор, архивирующий содержимое текущего каталога (без самого каталога):

tar -czvf $ARHNAME "."

8. Иначе, выводится сообщение о недопустимом значении параметра и помощь по использованию скрипта:

else
	echo "Wrong parameter(s)!"
	echo
	print_help


Итог


Скрипт целиком на GitHub
На PasteBin

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/03/05/prostoj-skript-dobavlyayushhij-tekushhij-katalog-v-arhiv/