используется параметр $@. Путем включения всех параметров в командную
строку, любые ключи, предназначенные команде 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 копирует только
файлы, которые оканчиваются на .asm, поэтому нет необходимости помнить
вид выражения для копирования этих файлов. Аналогично, ключ -c копирует
все файлы, оканчивающиеся на .c, и ключ -h копирует файлы, оканчивающи-
еся на .h.
Как мы увидим позже, прямое указание, о котором мы говорим здесь,
являеется выражением для команды grep. Использование всех возможностей
команды grep достигается при указании образцов имен файлов.
Используйте ключ -d для указания, с какого гибкого диска произво-
дится копирование. По умолчанию это устройство a: или A:. Не имеет зна-
чения, на каком регистре вы укажете имя устройства. Для уверенности
проверьте файл /etc/default/msdos. Этот файл содержит соответствия меж-
ду символом устройства и маршрутным именем XENIX. Например, файл может
выглядеть так:
A=/dev/fd048ds9
B=/dev/fd148ds9
C=/dev/hd0d
D=/dev/hd1d
X=/dev/fd096ds15
Y=/dev/fd196ds15
Как вы видите, маршрутные имена - это обычные имена устройств и
ничего больше.
В качестве основного средства выполнения работы dosflp использует
команду doscp. Это утилита способна понимать формат файловой системы
DOS. Dosflp передает ей обозначение устройства и другие опции
посредством переменных командного процессора. Например, ключ "-dB:" ме-
няет устройство на B вместо принятого по умолчанию устройства A.
Если выражения прямого указания типа файлов не соответствуют тому,