необходимую рутинную работу - убирает "мусор". Эта программа позволяет вам выбрать типы временных файлов, ко- торые должны периодически удаляться. Направляя их в "мусорный" каталог, can предоставляет вам возможность просмотреть все, что было удалено, и восстановить то, что вы на самом деле хотите сохранить. Программа dosflp допускает применение символов-шаблонов в именах файлов, используемых при копировании отобранных файлов с дискет формата MS-DOS в XENIX. Это упрощает операцию копирования и уменьшает число на- жатий на клавиши. 3.1.3. СРЕДСТВА КОПИРОВАНИЯ Далее представляется "рабочая лошадка" - средства копирования. Autobkp использует список маршрутных имен, чтобы определить, какие части файловой системы должны быть проверены. Затем эта программа копи- рует из выбранных областей те файлы, которые были добавлены или измене- ны в последние 24 часа. Cpiobr предоставляет интерактивное дополнение к команде cpio системы UNIX. Она позволяет вам скопировать файлы с жесткого диска на гибкий и, если необходимо, восстановить их с гибкого диска на жесткий. 3.1.4. СРЕДСТВА ПРОВЕРКИ ОПЕРАЦИЙ КОПИРОВАНИЯ Выполнение копирования не избавит вас от волнений, пока вы не бу- дете знать, что вы скопировали все, что хотели, и что копирование прош- ло корректно. Программа dsum использует контрольную сумму для проверки того, что исходный каталог и каталог-копия содержат одни и те же файлы. Программа log отображает регистрационный файл, чтобы показать, какое автоматическое копирование выполнялось в четыре часа утра, когда вы (надеемся) спали. При создании этих средств мы просмотрим некоторые важные команды системы UNIX и обнаружим новые способы их использования. Когда вы про- работаете всю данную главу, вы будете знать, как работать "с мельчайши- ми частицами" при использовании файловой системы UNIX. Вы сможете авто- матизировать иную большую область ваших компьютерных будней. Вы должны суметь создать пользовательские утилиты копирования и верификации, удовлетворяющие вашим нуждам. Вы сможете перевести вашу систему в режим работы, обеспечивающий ей самостоятельное выживание. (Мы оставляем фи- лософам определять, даст ли это вашему компьютеру примитивную форму жизни!) Между прочим, многие средства в данной главе пользуются преиму- ществами рекурсивных методов обхода дерева, которые мы разработали в предыдущей главе. Вы можете просмотреть тот материал, если у вас име- ются затруднения в понимании того, что представлено здесь. 3.2. ПЕРЕСЫЛКА ФАЙЛОВ 3.2.1. cptdir - копирование дерева каталога ИМЯ: cptdir cptdir Копирует дерево каталога в другое место ФУНКЦИЯ Копирует дерево файловой системы, корень которого расположен в ка- талоге, в другой каталог системы. Нет ограничений на какой-либо специ- фический каталог или жесткий диск. ФОРМАТ cptdir [-s] каталог-источник каталог-приемник ПРИМЕР ВЫЗОВА cptdir $HOME /bkp Копирует каждый файл из $HOME в каталог /bkp. КОМАНДНЫЙ ФАЙЛ cptdir 1 : 2 # &(#) cptdir v.1.0 Copy a directory tree Autor: Russ Sage 4 if [ $# -lt 2 -o $# -gt 3 ] 5 then echo "cptdir: argument error" >&2 6 echo "usage: cptdir [-s] srcdir desdir" >&2 7 echo " -s silent mode" >&2 8 exit 1 9 fi 11 if [ "$1" ="-s" ] 12 then OPT="-pd" 13 shift 14 else OPT="-pdv" 15 fi 17 SRC=$1 18 DEST=$2 19 umask 0 21 if [ -d $DEST ] 22 then echo "\"$DEST\" already exist. Remove it? (y/n): \c" 23 read CMD 24 if [ "$CMD" = "y" ] 25 then rm -rf $DEST 26 mkdir $DEST 27 fi 28 else mkdir $DEST 29 fi 31 if [ "`echo $DEST|cut -c1`" = "/" ] 32 then cd $SRC 33 find . -print | sort | cpio $OPT $DEST 34 else PWD=`pwd` 35 cd $SRC 36 find . -print | sort | cpio $OPT $PWD/$DEST 37 fi ПЕРЕМЕННЫЕ СРЕДЫ CMD Команда, полученная от пользователя DEST Каталог-приемник, в который нужно копировать OPT Опции, которые передаются утилите cpio PWD Текущий рабочий каталог SRC Каталог-источник, из которого нужно копировать Описание Зачем нам нужен cptdir? Мы уже отмечали необходимость в дополнительных командах, которые рекурсивно обходят древовидную структуру файловой системы UNIX. В ран- них версиях UNIX единственная команда tar могла управлять движением по дереву. В более новых версиях системы имеется опция -r в команде cp, которая делает cp рекурсивной (эта возможность реализована только в последней версии System V) и команда cpio. Последняя является многоце- левой командой копирования, которая может иметь дело как с потоковым форматом, так и с форматом файловой системы. Проблема при использовании даже таких улучшенных стандартных ко- манд системы UNIX состоит в том, что вам необходимо указать множество деталей и убедиться в том, что вы правильно используете синтаксис. Ошибки могут привести к потере времени и даже хуже того, к неожиданным побочным эффектам. С некоторыми из этих эффектов связаны изменения прав доступа и владельца, порядок распределения индексных дескрипторов фай- лов (inode), размещения файлов-приемников и результирующие полные име- на. Очень много необходимо запомнить и заново вызывать каждый раз при копировании. Поскольку такое копирование делается не часто, тяжело за- помнить все эти детали. Мы разрешаем эту проблему, автоматизируя детали процесса и в то же время предоставляя пользователю гибкость и управле- ние результатами. Мы создаем инструменты для управления файлами, кото- рые являются хорошими дополнительными средствами к основным командам системы UNIX. Что делает cptdir? Процедура cptdir копирует каталог (и все дерево под ним, если оно существует) в другой каталог системы. Поскольку каталоги предусматрива- ют логический доступ и не являются аппаратно-зависимыми (в отличие от имен устройств), то вы можете легко копировать файлы в другое место на том же диске или копировать их на другой диск полностью без специально- го синтаксиса или опций. Вы можете указать, хотите ли вы, чтобы на экран выводились имена копируемых файлов. Если вы не хотите этого, используйте опцию -s ("silent" - молчаливый). По умолчанию используется режим "verbose" (многословный), который отображает имена по мере копирования файлов. Заметьте, что это копирование, а не перемещение файлов. Недостаток копирования в отличие от перемещения заключается в том, что если прием- ником является каталог на том же диске, то вам требуется дополнительное место на диске для размещения второго образа. Вам также необходимо иметь достаточно описателей файлов (inodes) для сохранения всех файлов. В противном случае вы можете лишиться шанса сбросить в "мусорную корзи- ну" ваши рабочие файлы. В командной строке допустимо указание каталога-источника и имя ка- талога-приемника. Единственный ключ, допустимый в командной строке - это "-s". Любой другой ключ приводит к завершению команды, не вызывая никаких разрушений. Вы, конечно, можете добавить программный код с целью проверки опции и выдачи сообщения о допустимых ключах, если ука- зано нечто отличное от -s. Если вы делаете еще какую-либо проверку на наличие ошибок сверх того, что требуется для предотвращения разрушения данных или системы, то это дело личного вкуса. Минимизация проверок на наличие ошибок дает более компактные и быстрые сценарии, подходящие для опытных пользователей. Если указанный каталог-приемник не существует, то он создается. Если каталог-приемник уже существует, выдается сообщение об этом и вам задается вопрос о том, хотите ли вы очистить его. Если вы ответите "yes", каталог уничтожается и создается снова пустым. Если вы ответите "no", каталог остается таким, какой есть и копируемые файлы просто до- бавляются к уже существующим в наличии. При этом может возникнуть неко- торая путаница, особенно если некоторые файлы с такими именами уже су- ществуют в каталоге-приемнике. В большинстве случаев, однако, у пользо- вателей не появляется желания добавлять свою копию в существующий ката- лог. Тем не менее каталог-приемник должен быть создан, поскольку необ- ходимо его наличие, чтобы команда cpio работала правильно. Если же его нет, cpio не выполнится и выдаст сообщение об ошибке. Процедура cptdir начинает копирование путем прохождения по катало- гу-источнику и формирования списка файлов, находящихся в нем, рекурсив- но обходя дерево сверху вниз. В результате может получиться, что скопи- руется больше, чем вы планировали, поэтому вам необходимо знать размер файловой структуры, которую вы хотите скопировать. Затем файлы копиру- ются в каталог-приемник. Исходные файлы никак не модифицируются и не изменяются (за исключением того, что дата последнего доступа может быть модифицирована). Когда идет копирование, на экран выдается сообщение от cpio, кото- рое показывает полный маршрут к файлам-приемникам. Этот маршрут должен соответствовать маршруту, указанному в командной строке, в противном случае что-то не так. Примеры 1. $ cd /mnt $ cptdir /bin . Перейти на другой диск (обычно смонтированный в каталоге /mnt) и копировать все файлы из каталога /bin в текущий каталог. Обратите вни- мание, что результирующими файлами будут /mnt/*, что может не совпадать с вашим желанием. 2. $ cd /bin $ cptdir . /mnt/bin То же, что и в предыдущей команде, но обратите внимание, что точка изменила свою позицию. Команда указывает копирование всех файлов теку- щего каталога в каталог /mnt/bin. Получаются файлы /mnt/bin/*, что выг- лядит более резонным. 3. $ cptdir /bin /mnt То же, что и в примере 1. 4. $ cptdir /bin /mnt/bin То же, что и в примере 2. Пояснения В строках 4-9 производится проверка аргументов командной строки. Если указано меньше двух аргументов, этого недостаточно. Как минимум должны быть указаны имена каталога-источника и каталога-приемника. Бо- лее трех аргументов слишком много. Самое большее, там должны быть опция -s, каталог-источник и каталог-приемник. В строках 11-15 устанавливаются ключи команды cpio. По умолчанию это pdv, что означает "pass" (передача) для копирования в формате фай- ловой системы (в отличие от необработанного потока данных), "directory" (каталог) для создания каталога при необходимости и "verbose" (мно- гословный) для выдачи имен файлов по мере их копирования. Если первым позиционным параметром является ключ -s, который указывает запуск cptdir в молчаливом режиме, ключи команды cpio не содержат ключа выдачи сообщений и, таким образом имена файлов не выдаются на экран. Строки 17,18 и 19 устанавливают каталоги "откуда" и "куда" и уста- навливают переменную umask в 0. Переменная umask определяет подразуме- ваемые права доступа для всех файлов, созданных нашим командным про- цессором. Мы изменяем umask для гарантии того, что все файлы копируются в дерево-приемник и ни один из них не будет заблокирован из-за отсутствия прав чтения или записи. Побочным эффектом является то, что все каталоги имеют права доступа вида rwxrwxrwx, а все файлы - вида rw-rw-rw-, что может потребовать изменений для обеспечения вашей безо- пасности. Изменение umask имеет действие только на время работы проце- дуры. Когда cptdir завершается, umask вашего вызывающего командного процессора остается неизменным. Строки 21-29 выполняют проверку каталога-приемника. Если он уже существует, вас запрашивают, нужно ли его удалить и заново создать. Если он не существует, он создается для работы cpio. Строки 31-36 выполняют непосредственно копирование. Прежде чем объяснить, что здесь делается, давайте сперва посмотрим, как работает cpio. Поскольку оператор find генерирует список файлов, нам необходимо представлять, как его выход может влиять на выполнение cpio. Если мы указали "find . -print", то полные имена файлов будут иметь точку впереди, например: ./dir ./dir/file1 ./dir/file2 Это относительная нотация, которая очень полезна, когда вы не хо- тите, чтобы ваши файлы передавались согласно абсолютным маршрутным име- нам, но хотим сохранить их взаимосвязь друг с другом. Если на них ссы- латься относительно точки, то место, куда они будут помещены, может быть, где угодно. Однако, если мы скажем "find /dir -print", список бу- дет выглядеть так: /dir /dir/file1 /dir/file2 В обоих случаях мы ссылаемся на наш текущий каталог, но применение записи вида /dir заставляет полное имя начинаться с "/" и не допускает использование относительной нотации. Передача такой же информации ко- манде cpio может радикально изменить место размещения ваших файлов. Например, если я сказал "cd /src; find . -print | cpio -pdv /dest", ре- зультирующий список будет таким: /dest/./dir /dest/./dir/file1 /dest/./dir/file2 где на первом месте стоит, вероятно, то, что вы хотели. Однако, если я сказал "find /src -print | cpio -pdv /dest", результирующие маршрутные имена будут такими: /dest/src/dir /dest/src/dir/file1 /dest/src/dir/file2 что не очень хорошо, поскольку это создает уровень каталога, в ко- тором нет необходимости. Заметьте, что имя каталога "src" было перехва- чено при распечатке. Это произошло потому, что его выдал find, а cpio считает, что src было частью имени каталога-приемника. Повсеместное использование относительной нотации может привести нас к потере уже имеющейся информации. Например, если бы я сказал "cd /nowhere; find /src ....", каталог-приемник получил бы неверное имя. Мы должны уметь использовать этот тип нотации и не попадать в ловушки син- таксиса. Это и есть то, что делает cptdir. В строке 31 производится проверка на то, является ли первый символ в маршрутном имени целевого каталога символом "косая черта" ("/"). Если да, то мы точно знаем, что имя каталога-приемника выражено в виде абсо- лютного маршрутного имени, поэтому мы можем сменить каталоги без потери информации о нашем текущем каталоге. В строках 32-33 мы переходим в ка- талог-источник и копируем файлы. Но если первый символ каталога-приемника НЕ является наклонной чертой, используемая нотация является относительной. Это значит, что если мы сменим каталог, мы потеряем информацию о том, где мы находи- лись, когда был запущен командный файл. Чтобы избежать этого, мы полу- чаем в строке 34 полное имя текущего каталога путем перехвата вывода команды pwd и присвоения этого значения переменной таким образом, что позже мы сможем ее восстановить. Затем мы переходим в каталог-источник и копируем файлы, используя префикс абсолютного маршрутного имени от команды pwd и относительный суффикс того места, где мы находимся. Причиной того, что мы так поступаем, является использование от- носительной (точечной) нотации в операторе find. Как можно было видеть в предыдущем описании, отказ от использования точечной нотации может привести к путанице в маршрутных именах каталога-приемника. Для того чтобы всегда использовать точку в операторе find, нам необходимо убе- диться, куда мы собираемся пересылать файлы. Еще раз напомним, что ко- манда cd действует только для данного командного процессора "низкого" уровня, поэтому она не влияет на тот командный процессор, который за- пустил командный файл. Вообще, командный файл должен оставить пользова- телей в тех же условиях, в которых они находились перед его запуском, за исключением выполнения необходимых работ, при которых не произво- дится смена текущего каталога. Когда cptdir завершается, управление возвращается вызывающему ко- мандному процессору, который по-прежнему ведет свой собственный текущий каталог. Напомним, что всегда, когда вы переходите на более низкий уро- вень командного процессора, экспортируемые переменные передаются вниз, но НИЧЕГО не передается наверх. ВОЗМОЖНЫЕ МОДИФИКАЦИИ КОМАНДНОГО ФАЙЛА В нынешней реализации никакие дополнительные ключи не допускается передача никаких дополнительных ключей команде cpio. Что случится, если вы захотели заменить копирование файлов, где это возможно, созданием ссылок (ключ -l) или не менять время последнего доступа к исходному файлу при его копировании (опция -a)? Такие возможности были бы недо- пустимы. Можно легко добавить возможность передачи дополнительных аргумен- тов. Они должны быть опознаны как аргументы, сохранены и затем выбраны из командной строки. Для этого потребуется такой цикл: for ARG in $* do if [ "`echo $ARG|cut -c1`" = "-" ] then CPIOARG="CPIOARG $ARG" shift fi done Затем переменная CPIOARG может быть передана команде cpio. Еще одна область, где могут быть произведены изменения - это уп- равление правами доступа к файлам. Как объяснялось ранее, значение 0 для umask делает все права такими, что они разрешают запись. Если это вам не подходит, оператор find может быть изменен так, что будет произ- водиться выборочное копирование (и изменение прав доступа). Предположим, например, вы имеете каталог с двумя файлами. Если вы- полнился оператор "find /dir -print", список файлов будет таким: /dir /dir/file1 /dir/file2 Обратите внимание, что имя каталога появляется первым. Проблема возникает, если имя каталога не принадлежит вам или вы не имеете права записи. Происходит следующее: имя каталога копируется первым, устанав- ливаются права доступа (блокируя вас) и после этого file1 и file2 не могут быть скопированы в каталог dir. В cptdir мы применяем решение из- менить umask так, чтобы вы всегда имели права записи. Это своего рода клудж, но он работает. Другой путь - это изменить оператор find. Выполнение оператора "find /dir -depth -print" сгенерирует такой список файлов: /dir/file1 /dir/file2 /dir Обратите внимание, что имя каталога стоит ПОСЛЕДНИМ! Это правиль- но. Ключ -depth переворачивает список файлов так, что имя каталога пе- чатается последним. Что это дает? Фокус в том, что сначала копируются file1 и file2, а затем устанавливаются права доступа данного каталога. Вы можете за- писать файлы в каталог, для которого вы не имеете права записи. Благо- даря тому, что файлы копируются первыми, вы можете не беспокоиться о том, какого рода права доступа имеет этот каталог. К сожалению, ключ -depth команды find поддерживается не всеми версиями системы UNIX. 3.2.2. can - удаление файлов в "мусорную корзину" ---------------------------------------------------------------------- Имя: can ______________________________________________________________________ can Управление "мусорной корзиной" файлов НАЗНАЧЕНИЕ Перемещает файлы в "мусорную корзину", симулируя их удаление. Это допускает восстановление файлов после их кажущегося удаления. Формат вызова can [-l] [-r] file [file ...] Пример вызова can junk Посылает файл junk в "мусорную корзину" Исходный код для can 1 : 2 # @(#) can v1.0 Maintain file trash can Author: Russ Sage 4 CAN=$HOME/.trashcan 6 if [ ! -d $CAN ] 7 then mkdir $CAN 8 fi 10 if [ "`echo \"$1\"|cut -c1`" = "-" ] 11 then case $1 in 12 -l) echo "$CAN:" 13 ls -al $CAN 14 exit 0;; 15 -r) echo "removing $CAN/*:" 16 rm -rf $CAN/* 17 exit 0;; 18 -z|-?) echo "usage can [-l] [-r] file [file ...]" >&2 19 exit 0;; 20 esac 21 fi 23 mv $@ $CAN Переменные среды выполнения CAN Положение каталога "мусорной корзины" HOME Положение вашего регистрационного каталога Описание Зачем нам нужен can? По большому счету система UNIX, при всем ее великолепии, является просто структурой для накопления и манипулирования данными в файлах. Как мы отмечали раньше, эта система включает сотни файлов. Некоторые файлы вы желаете хранить неопределенно долго, в то время как другие отслужили свое и создают беспорядок на диске. К несчастью, легко выб- росить то, что в действительности вы хотели сохранить. Команду rm со- вершенно не украшает то, что она является печью для сжигания мусора: бросьте что-нибудь в нее и оно пропадет (если только вы не имеете ко- пии, а восстановление копии - это трудоемкая работа). Вот несколько классических примеров неверного применения команды rm: rm * /tmp <-- Удалить все файлы в каталоге /tmp Мы хотели сказать rm /tmp/*, а на самом деле произошло сначала удаление всех файлов в текущем каталоге, а затем попытка удалить /tmp. Последнее будет безуспешным, поскольку tmp - это каталог. В результате мы удалили все, что хотели сохранить, и сохранили все, что хотели уда- лить! Этот синтаксис похож на другие операторы UNIX, вроде "grep * file": противная ошибка. rm -rf / tmp <-- Удалить каталог tmp со всеми файлами Мы хотели сказать rm -rf /tmp, но нечаянно вставили пробел в ко- манду. На самом деле удалятся ВСЕ файлы во всей системе (если мы дадим команде выполняться достаточно долго), потому что мы сказали UNIX уда- лить корневой каталог и всех его потомков! Вы должны быть внимательны с командой rm. Если покажется, что что-то не так, удалите эту команду. Она может погубить вас. Одна такая ошибка может испортить вам целый день. После того, как это случится, вы станете осторожным на некоторое время, потом внимание ослабнет. Если вы не будете бдительным, ошибки вернутся, чтобы пресле- довать вас. Для нас "мусорная корзина" более желательна, чем печь для сжигания "мусора". Используя этот путь, вы можете вернуться и восстановить то, что вы выбросили по ошибке. Вы также хотели бы контролировать, когда появится мусоросборщик, захватит и окончательно удалит "мусор". Вы мо- жете периодически просматривать содержимое "мусорной корзины", а затем очищать корзину, когда вы уверены, что вы не хотите ничего в ней сохра- нять. Нельзя допускать, чтобы корзина была слишком заполнена, потому что она занимает дисковое пространство. Что делает can? Командный файл can предназначен для управления "мусорной корзиной" ваших файлов. Используя утилиту, вы можете свести к минимуму случайные потери во время работы и даже впоследствии восстанавливать файлы при необходимости. Can не только помещает ваши файлы в "мусорную корзину", но и пока- зывает вам, что в ней в настоящее время находится и очищает ее, когда вы этого хотите. Can распознает только ключи -l и -r. Ключ -l показывает, что нахо- дится в "мусорной корзине", а -r удаляет все ее содержимое. Запомните, что если вы что-то удалили из "мусорной корзины", вы не сможете его восстановить. Процесс помещения файлов в "мусорную корзину" выполняется командой mv. Ключи, предназначенные для can, должны быть первым аргументам в ко- мандной строке. Если вы желаете передать ключи команде mv, то их можно поместить в любом месте командной строки. Единственные ключи, дающие синтаксическую подсказку, - это -z и -?. Их предназначение - быть фла- гами только для обработки ошибок. Благодаря наличию специальных флагов обработки ошибок, выдающих справочную (help) информацию, ключи команды mv, как и ключи can, можно помещать первыми в командной строке, не ока- зывая влияния на can. Если вы создаете ваши командные файлы так, чтобы эти ключи всегда выдавали информацию об использовании (т.е. никогда не были "настоящими" ключами), то вы имеете хороший способ получения помо- щи по синтаксису. Многие (но, увы, не все) стандартные команды UNIX да- ют по ключам -z или -? подсказку об использовании и это полезно помнить всякий раз, когда вы попали в тупик. Если can не получает никаких ключей, действие по умолчанию заклю- чается в пересылке всех указанных файлов в "мусорную корзину", разме- щенную в вашем регистрационном каталоге под именем $HOME/.trashcan. Если этот каталог отсутствует, он автоматически создается при первом выполнении командного файла can. Это позволяет вам запускать команду, не указывая специального положения "корзины". Если вы применяете ключ -r, файлы в "мусорной корзине" будут удалены, а сама она нет. Примеры 1. $ can *.c Перемещает все файлы, которые оканчиваются на .c, в "мусорную кор- зину". 2. $ can -l Выдает список всех файлов, размещенных сейчас в "мусорной корзи- не". 3. $ can -r Удаляет все файлы из "мусорной корзины". 4. $ can -q * Передает ключ -q команде mv. Поскольку это недопустимый ключ ко- манды mv, она выдает сообщение об ошибке и завершается. Пояснения Строка 4 устанавливает место "мусорной корзины" так, чтобы она размещалась в вашем регистрационном каталоге под именем .trashcan. За- метьте, что ее именование, начиная с точки, делает ее нераспечатывае- мым, или скрытым файлом. Единственный способ увидеть такие файлы - использовать ключ -a в команде ls. Строки 6-8 проверяют, определен ли сейчас каталог "мусорной корзи- ны". Если нет, он создается. Обратите внимание, что поскольку его соз- даете вы, он имеет такие права доступа на чтение и запись, как в вашем регистрационном каталоге. Строки 10-21 проверяют, начинается ли первый позиционный параметр с черточки (-). Если такой параметр обнаружен, проверяется, является ли он ключом командного файла can (-l, -r, -z или -?). Обратите внимание, что для того, чтобы для использования двойных кавычек внутри двойных кавычек (строка 10), вы должны экранировать кавычки. Символ обратной косой черты (\) использован именно для этой цели. Если указан ключ -l, выдается напоминание об имени каталога "мусорной корзины", команда ls выводит список файлов в "мусорной корзи- не" и процедура can завершается, поскольку требовалось только вывести список. Если указан ключ -r, выдается сообщение об имени каталога очищае- мой "мусорной корзины" и файлы в ней удаляются командой rm. Это разру- шительная вещь и удаляет ваши файлы навсегда. После удаления can завер- шает работу. Вы можете дополнить программу процедуры так, чтобы давать подтверждение перед выполнением команды, если это позволит вам чувство- вать себя более спокойно. Если указан ключ -z или -?, выдается подсказка об использовании и can завершается. Это не совсем хорошо, но мы не можем использовать сим- вол *, соответствующий любому другому ключу, поскольку ключ может быть предназначен для команды mv, а не для can. Благодаря использованию все- го двух аргументов для обработки ошибок, мы можем разрешить передачу всех остальных аргументов. Если ключ не является одним из ключей can, или одним из указанных ключей обработки ошибок, то он передается коман- де mv. Если ключ недопустим для этой команды, команда mv выдает свое сообщение об ошибке и завершает работу. Вы можете, естественно, модифи- цировать командный файл так, чтобы он проверял допустимость ключей ко- манды mv на "внешнем" уровне. Тогда он может выдать сообщение об ошибке и завершиться, если указанный ключ недопустим ни для can, ни для mv. Вопрос в том, стоит ли платить за более полный контроль над обработкой ошибок ценой разбухания программы и временем исполнения. Строка 23 выполняет собственно перемещение файлов в "мусорную кор- зину". Заметьте, что это выполняется только если не указаны никакие ключи can, поскольку это поведение can, принятое по умолчанию. Здесь используется параметр $@. Путем включения всех параметров в командную строку, любые ключи, предназначенные команде mv, передаются ей. Таким способом мы можем изменить путь, которым файлы посылаются в "мусорную корзину". 3.2.3. dosflp - копирование файлов с гибкого диска формата MS-DOS с использованием символов шаблона в именах файлов ------------------------------------------------------------------- Имя: dosflp _____________________________________________________________________ dosflp Копирование файлов с гибкого диска формата DOS с использованием символов шаблона в именах файлов НАЗНАЧЕНИЕ Копирует файлы с гибкого диска в формате DOS (в XENIX) на жесткий диск. Обеспечивает возможность использования записи с помощью симво- лов-шаблонов для имен файлов на гибком диске, где такая запись обычно недопустима. ФОРМАТ ВЫЗОВА dosflp [-a] [-c] [-dDRIV] [-eEXP][-h] [-l] [-r] [-sDIR] где -a означает копирование файлов, соответствующих *.asm -c означает копирование файлов, соответствующих *.c -d выбирает имя устройства DRIV из набора A,B,X,Y (по умолчанию A) -e использует выражение EXP, чтобы применить к файлам grep -h копирует файлы, соответствующие *.h -l только выдает список файлов -r удаляет файлы вместо их копирования -s указывает подкаталог DIR на гибком диске формата DOS Пример вызова dosflp Копирование всех файлов с устройства A: в текущий каталог Исходный код для dosflp 1 : 2 # @(#) dosflp v1.0 Wildcard copies from DOS floppy Author: Russ Sage 4 EXP=.\* 5 DRIVE="A:" 6 OP="c" 8 if [ "$#" -gt 0 ] 9 then for ARG in $@ 10 do 11 case "$ARG" in 12 -a) EXP='.*\.asm$';; 13 -c) EXP='.*\.c$';; 14 -d*) DRIVE="`echo $ARG | cut -c3-`:";; 15 -e*) EXP='`echo $ARG | cut -c3-`';; 16 -h) EXP='.*\.h$';; 17 -l) OP="l";; 18 -r) OP="r";; 19 -s*) DRIVE="$DRIVE`echo \"$ARG" | cut -c3- `/";" 20 *) echo "dosflp: arg error" 21 echo "usage: dosflp [-a] [-c] [-d] [-e] [-h] [-l] [-r] [-s]" 22 exit 1;; 23 esac 24 done 25 fi 27 case $OP in 28 c) echo "\nCopying files from $DRIVE to `pwd`";; 29 l) echo "\nListing files on $DRIVE" 30 dosdir $DRIVE | more 31 exit;; 32 r) echo "This option removes all the data on the floppy." 33 echo -n "Do you want to do this (y/n): " 34 read RSP 35 if [ "$RSP" = "y" ] 36 then echo "\nRemoving files on $DRIVE" 37 else exit 38 fi;; 39 esac 41 dosls $DRIVE | tr "[A-Z]" "[a-z]" > /tmp/doslist 43 for FILE in `grep "$EXP" /tmp/doslist` 44 do 45 echo $FILE 46 case $OP in 47 c) doscp $DRIVE$FILE .;; 48 r) dosrm $DRIVE$FILE;; 49 esac 50 done 52 rm /tmp/doslist Переменные среды выполнения ARG Хранит аргументы командной строки DRIVE Устройство с гибким диском формата DOS EXP Выражение, имитирующее действие символа-шаблона FILE Хранит имя файла, над которым производится действие OP Ключ, определяющий необходимое действие Описание Зачем нам нужен dosflp? Это команда только для системы XENIX. Операционная система XENIX, являясь продукцией фирмы Microsoft, имеет средства для общения с файло- вой системой MS-DOS. Для ознакомления с основами совместного использо- вания DOS и XENIX давайте рассмотрим основные параметры. Каждый жесткий диск может иметь максимум четыре раздела. Это огра- ничение MS DOS, которое перенесено в мир XENIX. Ничего плохого в этом нет, пока мы не начинаем работать с жестким диском большой емкости. Для 70-мегабайтного диска, например, вы можете создать четыре рав- ных раздела, каждый из которых содержит приблизительно 17 Мбайт. Вы мо- жете создать меньший раздел, но тогда другой раздел должен быть больше. В зависимости от того, какая часть ваших программ и данных должна быть использована в основном MS-DOS и какая - XENIX, может быть использована различная конфигурация. Большим преимуществом системы XENIX/DOS является то, что XENIX мо- жет размещаться в одном разделе, а DOS в другом. Как это сделать? Нужно запустить программу "fdisk" в каждой операционной системе. Это значит, что XENIX может общаться с разделом DOS, получая полное имя устройства, указывающее на другой раздел. Драйвер, который читает раздел DOS, дол- жен знать, как выглядит DOS (т.е. знать файловую систему DOS). Если вы- полнить такую операцию, можно получать списки файлов и копировать их туда и обратно. К сожалению, DOS не имеет возможности чтения разделов XENIX. При работе с гибким диском вы имеете дело только с одним разделом. Это снова ограничение DOS. Некоторые системы UNIX, в отличие от DOS, позволяют иметь столько разделов на жестком или гибком диске, сколько вы хотите, в отличие от DOS. По определению, гибкий диск DOS сформати- рован в системе DOS, которая выполняет форматирование низкого уровня и помещает файловую систему DOS на гибкий диск. В системе XENIX гибкий диск может быть либо в формате файловой системы, либо неструктурированным устройством последовательного доступа подобно магнитной ленте. Для процедуры dosflp мы используем только гиб- кие диски в формате DOS. Теперь к делу. Предположим, вы имеете систему DOS и файлы, находя- щиеся на диске DOS, вы можете читать и писать файлы на гибкий диск из XENIX. Но существуют некоторые ограничения на выполнение операции копи- рования, которые не слишком удобны пользователю. Например, вы можете сказать "doscp *.c a:". В результате все файлы текущего каталога кото- рые оканчиваются на .c, будут скопированы на гибкий диск формата DOS на устройстве a:. Побочный эффект выполнения doscp заключается в том, что все символы перевода строки (или прогона строки) превращаются в символ возврат каретки/перевод строки, поскольку DOS обрабатывает конец строки иначе, чем XENIX. Таким же образом, когда вы копируете с гибкого диска формата DOS в XENIX, лишние символы возврата каретки убираются. Что вы не можете сделать, так это сказать "doscp a:*.c". Команда doscp не допускает указания вида *.c при копировании с гибкого диска. Это происходит потому, что командный процессор распространяет метасим- волы (*,?,[]) и не может непосредственно читать раздел DOS. Поэтому вы не можете использовать символы при копировании с гибкого диска DOS. Отметим, что может наблюдаться гораздо больше побочных эффектов, когда вы имеете дело с гибкими дисками DOS. Во-первых, длина имени фай- ла ограничена. DOS допускает до восьми символов имени файла плюс три символа расширения. В результате после копирования всех ваших файлов XENIX на гибкий диск многие из них могут иметь не те имена, которые они имели в XENIX. Это сущее страдание, когда вы пытаетесь сделать копию на гибкие диски DOS, потому что вы больше не имеете уверенности, как обра- щаться к файлам, когда вы копируете их обратно с гибкого диска. Кроме того, поскольку расширение имени файла в DOS имеет только три символа, файл с именем "spreadsheet.finance" может оказаться на гибком диске DOS с именем "spreadsh.fin" и распознавание его может представлять опреде- ленные трудности. Но это еще не все. Когда файл копируется из XENIX в DOS, ВСЕ имена в DOS записываются заглавными буквами. Если у вас есть файлы с именами, в которых смешаны верхний и нижний регистры, то вы несколько потеряете понятность имен. Если вы используете в именах символы верхнего регистра при копировании файлов обратно в XENIX, они не переводятся на нижний регистр. В результате все имена ваших файлов оказываются записанными символами верхнего регистра в XENIX, что не очень удобно. В чем мы нуждаемся, так это в таком средстве, которому мы можем указывать, какие файлы копировать с гибкого диска на жесткий диск, и которое копирует их с сохранением регистра в имени файла. Все это дела- ет процедура dosflp. Что делает dosflp? Dosflp пытается исключить все негативные аспекты копирования фай- лов XENIX/DOS. Это высокое требование, но оно достижимо. Вкратце подход dosflp следующий: получить список имен файлов с гибкого диска, пере- вести имена в нижний регистр, выбрать из полного списка имена тех фай- лов, которые соответствуют вашим требованиям, и затем копировать файлы один за другим в текущий каталог XENIX. Для того, чтобы сделать это, требуется гораздо больше команд XENIX вида dosxx, а также различных других команд XENIX. В дополнение к копированию, dosflp также выдает список файлов, ко- торые имеются на гибком диске DOS, и удаляет файлы с гибкого диска. Эти функции легко реализовать, потому что как только один раз процедура доступа написана, добавить новые команды для выполнения операций над файлами довольно просто. Обычно мы хотим управлять файлами определенного типа как группой. Сюда относятся ассемблерные исходные файлы, исходные файлы на языке C и файлы-заголовки на языке C. Поэтому, чтобы снять с вас обязанности по вводу универсальных символов для этих типов файлов, мы прямо указываем их в качестве опций команды dosflp. Например, ключ -a копирует только файлы, которы