Задача
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