#·· с помощью символических или жестких ссылок. Это позволит прозрачно
#·· работать со сжатыми файлами.
Z="compress"; unZ="uncompress"; Zlist=""
gz="gzip"···; ungz="gunzip"···; gzlist=""
bz="bzip2"··; unbz="bunzip2"··; bzlist=""
# Первый шаг: попытаться изолировать имена файлов в командной строке.
#·· Сделаем это последовательно, перебирая аргументы по одному и проверяя,
#·· являются ли они именами файлов. Если очередное имя соответствует файлу и имеет
#·· расширение, характеризующее программу сжатия, распакуем файл, запишем имя
#·· файла и повторим итерацию.
#·· По окончании повторно сожмем все, что было распаковано.
for arg
do
··if [-f "$arg"]; then
····case "$arg" in
······*.Z) $unZ "$arg"
·········· arg="$(echo $arg | sed 's/\.Z$//')"
·········· Zlist="$Zlist \"$arg\""
··········;;
······*.gz) $ungz "$arg"
············arg="$(echo $arg | sed 's/\.gz$//')"
············gzlist="$gzlist \"$arg\""
············;;
······*.bz2) $unbz "$arg"
············ arg="$(echo $arg | sed 's/\.bz2$//')"
············ bzlist="$bzlist \"$arg\""
············;;
····esac
··fi
··newargs="${newargs:-""} \"$arg\""
done
case $0 in
·· *zcat*) eval cat $newargs·············;;
··*zmore*) eval more $newargs············;;
··*zgrep*) eval grep $newargs············;;
········*) echo "$0: unknown base name. Can't proceed." >&2
············exit 1
esac
# Теперь сожмем все.
if [! -z "$Zlist"]; then
fi
if [! -z "$gzlist"]; then
fi
if [! -z "$bzlist"]; then
fi
# Вот и все!
exit 0
Как это работает
Для сжатого файла с любым расширением требуется выполнить три шага: распаковать файл, удалить расширение из имени файла и добавить его в список для повторного сжатия в конце сценария. Поддерживая три разных списка, по одному для каждой программы сжатия, этот сценарий позволяет также выполнять поиск с помощью grep по нескольким файлам, сжатым разными утилитами.
Наиболее интересный трюк в этом сценарии — использование директивы eval для повторного сжатия файлов
Запуск сценария
Для правильной работы сценарий должен иметь три имени. Как это сделать в Linux? Просто: вам помогут ссылки. Можно использовать символические ссылки — специальные файлы, хранящие имена файлов, на которые они ссылаются, или жесткие ссылки, фактически являющиеся индексными узлами inode, ссылающимися на файл. Мы предпочитаем использовать символические ссылки. Их легко создавать, как показано ниже, в листинге 4.16 (здесь предполагается, что сам сценарий сохранен в файле с именем zcat).
Листинг 4.16. Создание символических ссылок zmore и zgrep на сценарий zcat
$ ln −s zcat zmore
$ ln −s zcat zgrep
После этого у вас появятся три новые команды, в действительности являющиеся одним и тем же сценарием, и каждая может принимать список файлов, распаковывать, обрабатывать и вновь упаковывать их.
Результаты