Средства UNIX для работы с каталогами и текстовыми файлами, потоковый редактор sed

Средства обработки структурированных текстовых данных, обработки каталогов. Знакомство с утилитой make, получение навыка написания простейших make-файлов. Пример использования утилиты cat. Утилиты more и less для просмотра содержания больших файлов.

Рубрика Программирование, компьютеры и кибернетика
Вид лекция
Язык русский
Дата добавления 27.11.2013
Размер файла 99,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Следующая awk-программа (см. пример 6.32) позволяет разложить список поиска, хранящийся в переменной окружения PATH, по элементам массива.

BEGIN {

n = split (ENVIRON ["PATH"], path, ": ")

for (i = 1; i <= n; ++i)

print path [i]

}

Листинг 6.32. Пример awk-программы, использующей встроенную функцию split ().

В пример 6.33 приведен фрагмент командного файла, выполняемого при выключении системы. Здесь можно обратить внимание на разные виды экранирования. (Третье поле в выдаче mount - это точка монтирования.)

# Перемонтируем на чтение все, что еще остается смонтированным.

mount | awk '/ (\/ |^\/dev\/root) / { print $3 }' | while read line; do

mount - n - o ro,remount $line

done

Листинг 6.33. Пример использования утилиты awk в системном командном файле.

Отметим, что в POSIX-2001 стандартизована весьма развитая версия awk, входной язык которой приближен к языку C.

На уровне функций работа с регулярными выражениями поддержана семейством regex (см. пример 6.34).

#include <regex. h>

int regcomp (regex_t *restrict preg,

const char *restrict pattern, int cflags);

int regexec (const regex_t *restrict preg,

const char *restrict string,

size_t nmatch, regmatch_t

pmatch [restrict], int eflags);

void regfree (regex_t *preg);

size_t regerror (int errcode, const regex_t

*restrict preg, char *restrict errbuf,

size_t errbuf_size);

Листинг 6.34. Описание функций семейства regex ().

Первый член этого семейства, функция regcomp (), компилирует регулярное выражение, заданное аргументом pattern, и помещает результат компиляции в структуру типа regex_t, на которую указывает аргумент preg. Эта структура, описанная в заголовочном файле <regex. h>, должна содержать про крайней мере поле

size_t re_nsub;

/* Число заключенных в скобки подвыражений */

Третий аргумент функции regcomp (), cflags, задается как побитное ИЛИ следующих флагов:

REG_EXTENDED

Использовать расширенные регулярные выражения (подразумеваемый тип регулярных выражений - базовые).

REG_ICASE

При сопоставлении не различать большие и малые буквы.

REG_NOSUB

В regexec () сообщать только об успехе/неудаче сопоставления (и не устанавливать значения поля re_nsub структуры regex_t).

REG_NEWLINE

Изменить трактовку переводов строк (мы не будем на этом останавливаться).

Функция regexec () сопоставляет цепочку символов string со скомпилированным шаблоном, заданным аргументом preg. При успешном выполнении результат равен нулю; в противном случае возвращается ненулевое значение, свидетельствующее о неудаче сопоставления или ошибке. Аргумент eflags - побитное ИЛИ флагов REG_NOTBOL и REG_NOTEOL - определяет, являются ли границы цепочки границами строки, что важно для обработки фиксаторов ^ и $. Если значение аргумента nmatch равно нулю или при вызове regcomp () был задан флаг REG_NOSUB, аргумент pmatch функции regexec () игнорируется. В противном случае он должен указывать на массив не менее чем из nmatch элементов, который будет заполнен смещениями подцепочек, сопоставленных с заключенными в скобки подвыражениями шаблона (pmatch [0] соответствует всему регулярному выражению, в неиспользуемые элементы помещается - 1).

Структурный тип regmatch_t должен включать по крайней мере следующие поля:

regoff_t rm_so;

/* Смещение в байтах начала подцепочки

от начала цепочки */

regoff_t rm_eo;

/* Смещение в байтах первого символа за

концом подцепочки от начала цепочки */

Тип regoff_t определяется как целое со знаком, способное вместить любое значение типов off_t и ssize_t.

Функция regfree () освобождает память, запрошенную вызовом regcomp () с тем же значением аргумента preg, которое после этого нельзя использовать как указатель на скомпилированное регулярное выражение.

В файле <regex. h> определены константы, возвращаемые функциями семейства regex () в случае ошибки. Например, значение REG_NOMATCH возвращается функцией regexec () при неудаче сопоставления, REG_BADPAT обозначает некорректное регулярное выражение, REG_ESPACE - нехватку памяти и т.д. Функция regerror () отображает эти константы в неспецифицируемые стандартом цепочки печатных символов и помещает их в буфер errbuf. Приложение, вызывая regerror (), должно передать в качестве аргумента errcode последнее ненулевое значение, возвращенное функциями regcomp () или regexec () с заданным значением аргумента preg.

Приведем пример использования функций семейства regex () (см. пример 6.35). Обратим внимание на задание флага REG_NOTBOL при повторных обращениях к regexec ().

#include <stdio. h>

#include <limits. h>

#include <regex. h>

/* Программа ищет все вхождения заданного шаблона во всех входных строках */

/* и выводит успешно сопоставленные подцепочки */

#define PATTERN " [A-Za-z] [A-Za-z0-9] {0,31}"

int main (void) {

char line [LINE_MAX]; /* Буфер для входных строк */

char *pline; /* Указатель на начало сопоставляемой части строки */

regex_t cere; /* Скомпилированное расширенное регулярное выражение */

regmatch_t pm; /* Структура для запоминания границ сопоставленной подцепочки */

int reerrcode; /* Код ошибки от regcomp или regexec */

char reerrbuf [LINE_MAX]; /* Буфер для строк с сообщениями об ошибках */

int i;

if ( (reerrcode = regcomp (&cere, PATTERN, REG_EXTENDED))! = 0) {

(void) regerror (reerrcode, &cere, reerrbuf, sizeof (reerrbuf));

fputs (reerrbuf, stderr);

fputc ('\n', stderr);

regfree (&cere);

return (reerrcode);

}

fputs ("Вводите строки, сопоставляемые с шаблоном " PATTERN "\n", stdout);

while (fgets (line, sizeof (line), stdin)! = NULL) {

/* Произведем первое сопоставление с прочитанной строкой. */

/* Оно отличается от остальных при наличии в шаблоне фиксатора начала */

reerrcode = regexec (&cere, pline = line, 1, &pm, 0);

while (reerrcode == 0) {

/* Повторяем, пока сопоставления с остатком строки успешны */

fputs ("Сопоставленная подцепочка:", stdout);

for (pline += pm. rm_so, i = pm. rm_eo - pm. rm_so; i - > 0;) {

fputc (*pline++, stdout);

}

fputc ('\n', stdout);

reerrcode = regexec (&cere, pline, 1, &pm, REG_NOTBOL);

}

}

regfree (&cere);

return (ferror (stdin) || ferror (stdout));

}

Листинг 6.35. Пример использования функций семейства regex ().

Читателю рекомендуется поэкспериментировать с шаблоном PATTERN, пробуя различные варианты, в том числе некорректные.

Идейно простым, но весьма мощным и полезным средством обработки текстовых файлов является служебная программа преобразования символов tr:

tr [-c | - C] [-s] цепочка1 цепочка2

tr - s [-c | - C] цепочка1

tr - d [-c | - C] цепочка1

tr - ds [-c | - C] цепочка1 цепочка2

Она не применяет регулярных выражений как таковых, но в цепочках - аргументах можно употреблять конструкции, аналогичные некоторым односимвольным РВ.

Утилита tr копирует стандартный ввод на стандартный вывод с заменой либо удалением выбранных символов. При отсутствии опций введенные символы, найденные в цепочке1, заменяются на соответствующие (стоящие на тех же относительных позициях) символы из цепочки2. Опции - c и - C предписывают использовать вместо цепочки1 ее дополнение до множества всех символов; в первом случае дополнение упорядочивается в соответствии с кодировкой, во втором - по алфавиту. По опции - d будут удалены все входные символы, заданные цепочкой1. Опция - s задает сжатие (до одного) последовательностей одинаковых символов, специфицированных последней из цепочек, указанных в командной строке (сжатие производится после каждой замены и/или удаления).

Чтобы задавать в цепочках - аргументах утилиты tr группы символов, можно воспользоваться следующими конструкциями.

c1-c2

Обозначает цепочку символов, лежащих в диапазоне от c1 до c2 включительно.

[: класс_символов:]

Обозначает цепочку символов, принадлежащих указанному классу (см. выше описание базовых регулярных выражений).

[=класс_эквивалентности=]

Обозначает цепочку символов, принадлежащих указанному классу эквивалентности при алфавитном сравнении.

[c*n]

Обозначает символ c, повторенный n раз. Может использоваться только в цепочке2. Если первая цифра в n есть 0, n рассматривается как восьмеричное число; иначе - как десятичное. Нулевое или отсутствующее n воспринимается как "очень много"; эта возможность полезна при дополнении цепочки2 до длины цепочки1.

Обратный слэш можно использовать для задания управляющих символов ('\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v'). Кроме того, \ обозначает код символа, если за ним идут одна, две или три восьмеричные цифры.

Следующая команда (см. пример 6.36) помещает список всех слов из файла f1, по одному на строку, в файл f2 (под словом понимается максимальная последовательность букв).

tr - cs ' [: alpha:] ' ' [\n*] ' < f1 > f2

Листинг 6.36. Пример использования служебной программы tr.

Команда, показанная в пример 6.37, переводит большие буквы в малые, попутно сжимая последовательности одинаковых (без учета регистра) букв.

tr - s ' [: upper:] ' ' [: lower:] '

Листинг 6.37. Пример трансляции и сжатия последовательностей символов с использованием служебной программы tr.

Служебная программа uniq

uniq [-c | - d | - u] [-f число] [-s число]

[входной_файл [выходной_файл]]

позволяет сократить до одной подряд идущие одинаковые строки (сделать одинаковые строки файла смежными можно с помощью утилиты sort).

Опции предоставляют дополнительный сервис.

c

Перед каждой выходной строкой помещать ее кратность во входном файле.

d

Подавить вывод неповторяющихся строк.

f число

При сравнении строк игнорировать заданное число начальных полей. Поле определяется как максимальная цепочка символов, успешно сопоставляемая с базовым регулярным выражением [[: blank:]] * [^ [: blank:]] *.

s число

При сравнении строк игнорировать заданное число начальных символов. При совместном использовании опций - f и - c игнорируется указанное число символов, идущих после заданного числа полей.

u

Подавить вывод строк, повторявшихся во входном файле.

В качестве примера употребления утилиты uniq приведем конвейер, позволяющий найти десять самых употребительных заголовочных файлов среди включаемых в стандартные заголовочные файлы, расположенные в каталоге /usr/include и его подкаталогах (см. пример 6.38). Результат работы конвейера может выглядеть так, как показано в пример 6.39.

find /usr/include - name '*. h' - exec cat

{} \; | tr - d ' [: blank:] ' | \

grep - E - e '^#include (<. *>|". *") '

| sort | uniq - dc | sort - r | head

Листинг 6.38. Пример использования служебной программы uniq.

977 #include"nsISupports. h"

315 #include<glib. h>

201 #include<gdk/gdk. h>

167 #include<glibmm. h>

160 #include<features. h>

154 #include<glib-object. h>

144 #include"nsCOMPtr. h"

139 #include<sys/types. h>

139 #include<glibmm/class. h>

135 #include"nscore. h"

Листинг 6.39. Возможный результат работы конвейера, показанного в листинге 6.38.

Аналоги реляционных операций для текстовых файлов

Служебная программа cut

cut - b список [-n] [файл.]

cut - c список [файл.]

cut - f список [-d разделитель]

[-s] [файл.]

используется для выборки байт (опция - b), символов (-c) либо ограниченных разделителями полей (опция - f) с заданными списком номерами из строк исходных файлов, их конкатенации и выдачи на стандартный вывод. Если применить терминологию реляционных баз данных, cut выполняет операцию проекции отношения.

Список, являющийся аргументом опций - b, - c и - f, задается как последовательность разделенных запятыми или пробелами положительных чисел или диапазонов (с естественными умолчаниями, когда границы опущены). Опция - d определяет разделитель полей (по умолчанию это символ табуляции), - n предписывает не разрывать (многобайтные) символы, опция - s в сочетании с - f подавляет вывод строк, в которых не оказалось символов-разделителей (по умолчанию такие строки копируются на стандартный вывод без изменений).

Пример. Чтобы выделить из базы данных пользователей входные имена и идентификаторы, можно воспользоваться командой, показанной в пример 6.40. Начальный фрагмент возможного результата приведен в пример 6.41.

cut - d: - f 1,3 /etc/passwd

Листинг 6.40. Пример использования служебной программы cut.

root: 0

bin: 1

daemon: 2

adm: 3

lp: 4

sync: 5

Листинг 6.41. Начальный фрагмент возможного результата работы служебной программы cut.

Служебная программа paste

paste [-s] [-d список] файл.

в терминологии реляционных баз данных осуществляет горизонтальное соединение, конкатенируя соответственные строки исходных файлов и помещая результат на стандартный вывод. При наличии опции - s конкатенируются строки каждого из исходных файлов. Во всех случаях строки склеиваются посредством символа табуляции (по умолчанию) или символов из списка - аргумента опции - d. Список этих символов рассматривается как кольцевой, т.е. будучи исчерпан, он используется повторно. Сочетание \0 в нем трактуется как пустая цепочка, а не как нулевой символ.

В качестве имени исходного файла может быть задан минус, что означает стандартный ввод. Если минус употреблен многократно, то стандартный ввод читается построчно, циклически по именам - минусам. Любопытно отметить, что стандарт POSIX-2001 предписывает реализациям поддерживать обработку не менее двенадцати исходных файлов.

Рассмотрим несколько примеров. Для выдачи в четыре столбца имен файлов текущего каталога можно воспользоваться конвейером, показанным в пример 6.42.

ls | paste - -

Листинг 6.42. Пример использования служебной программы paste.

Для попарного слияния последовательных строк файла целесообразно "сыграть" на том, что список разделителей - кольцевой (см. пример 6.43).

paste - s - d "\0\n" f. txt

Листинг 6.43. Пример использования служебной программы paste с кольцевым списком разделителей.

Если файл не подпадает под определение текстового из-за чрезмерно длинных строк, утилитой cut можно выделить начальные байты, поместив "хвосты" строк в другой файл. В дальнейшем из двух полученных файлов с помощью служебной программы paste можно воссоздать исходный (см. пример 6.44).

cut - b 1-80 - n f > f1. txt

cut - b 81 - n f > f2

paste - d '\0' f1. txt f2 > f3

Листинг 6.44. Пример использования служебных программ cut и paste.

Еще один оператор реляционной СУБД - join - выдает на стандартный вывод результат соединения двух отношений, задаваемых строками файла1 и файла2:

join [-a номер_файла | - v номер_файла]

[-e цепочка] [-o список] [-t символ]

[-1 номер_поля] [-2 номер_поля] файл1 файл2

Отношения файл1 и файл2 должны быть отсортированы в возрастающем лексикографическом порядке по полям соединения (обычно по первому полю в каждой строке).

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

Как правило, поля разделяются символами пробела, табуляции или перевода строки. В этом случае несколько последовательных разделителей интерпретируются как один и начальные разделители отбрасываются. Подразумеваемым разделителем при выводе является пробел.

Допустимы следующие опции.

a номер_файла

В дополнение к обычному выводу выдать строку для каждой непарной строки из файла с указанным номером (1 или 2).

e цепочка

Заменить пустые поля вывода из списка опции - o заданной цепочкой символов.

o список

Составлять выходные строки из полей, заданных в списке. Элемент списка имеет вид номер_файла. номер_поля или

t символ

Использовать символ в качестве разделителя. Каждое вхождение символа в строку значимо. Указанный символ используется как разделитель и при вводе, и при выводе.

v номер_файла

Вместо подразумеваемого вывода выдавать только непарные строки из файла с указанным номером (1 или 2).

1 номер_поля

Производить соединение по полю файла1 с заданным номером.

2 номер_поля

Производить соединение по полю файла2 с заданным номером.

Рассмотрим примеры. Командная строка (см. пример 6.45) выполняет соединение баз данных пользователей и групп, отсортированных в порядке возрастания идентификаторов групп. На стандартный вывод поступают входные имена, имена групп и основные каталоги (см. пример 6.46).

join - 1 4 - 2 3 - o 1.1,2.1,1.6 - t:

passwd. sorted group. sorted

Листинг 6.45. Пример использования служебной программы join.

halt: root: /sbin

operator: root: /root

root: root: /root

shutdown: root: /sbin

sync: root: /sbin

bin: bin: /bin

daemon: daemon: /sbin

Листинг 6.46. Начальный фрагмент возможного результата работы служебной программы join.

Пусть имеется два упорядоченных по алфавиту справочника: номера телефонов и адреса электронной почты (см. пример 6.47). Предполагается, что в качестве разделителя полей применяется символ табуляции. Тогда командная строка, показанная в пример 6.48, позволит получить объединенный справочник (см. пример 6.49).

Имя Номер телефона

Иван 123-4567

Петр 123-5678

Яков 123-6789

Имя Адрес электронной почты

Иван ivan123@mail.ru

Олег oleg@yahoo.com

Яков yak@yandex.ru

Листинг 6.47. Возможное содержимое двух справочников с информацией о телефонных номерах и об адресах электронной почты.

join - t '<tab>' - a 1 - a 2 - e '---------'

o 0,1.2,2.2 phone. txt email. txt

Листинг 6.48. Еще один пример использования служебной программы join.

Имя Номер телефона Адрес электронной почты

Иван 123-45-67 ivan123@mail.ru

Олег - ------ - oleg@yahoo.com

Петр 123-56-78 - --------

Яков 123-67-89 yak@yandex.ru

Листинг 6.49. Возможный результат работы служебной программы join.

Читателю предлагается самостоятельно выбрать правильный способ задания символа табуляции в качестве аргумента опции - t служебной программы join, а также объяснить, зачем нужен пробел в начале заголовка каждого из справочников.

Средства обработки каталогов (средства Си)

Обработка каталогов, как и обычных файлов, начинается с их открытия. Для этого предназначена функция opendir () (см. пример 6.50).

#include <dirent. h>

DIR *opendir (const char *dirname);

Листинг 6.50. Описание функции opendir ().

После открытия текущим становится первый элемент каталога. Если в дальнейшем понадобится вновь позиционироваться на первый элемент, можно воспользоваться функцией rewinddir () (см. пример 6.51).

#include <dirent. h>

void rewinddir (DIR *dirp);

Листинг 6.51. Описание функции rewinddir ().

Чтение элементов каталога выполняет функция readdir () (см. пример 6.52), которая возвращает указатель на структуру, представляющую текущий элемент каталога; после ее завершения текущим становится следующий элемент достижении конца каталога и в случае ошибки возвращается пустой указатель. Следовательно, если приложению необходимо различать обе ситуации, оно должно обнулить значение переменной errno перед вызовом readdir (), а затем, если результат равен NULL, проанализировать это значение.

#include <dirent. h>

struct dirent *readdir (DIR *dirp);

Листинг 6.52. Описание функции readdir ().

Согласно стандарту POSIX-2001, структура dirent содержит по крайней мере одно поле:

char d_name []; /* Имя файла */

В качестве необязательного описано еще одно поле:

ino_t d_ino; /* Порядковый номер файла */

Если элемент каталога представляет символьную ссылку, значение этого поля не определено.

Следует учитывать, что указатель, возвращаемый функцией readdir (), может ссылаться на область памяти, перезаписываемую другими обращениями к readdir () с тем же значением аргумента dirp. Кроме того, нужно помнить и о том, что содержимое читаемого каталога асинхронно изменяют другие процессы (потоки управления), создающие и удаляющие файлы.

После завершения работы с каталогом его следует закрыть с помощью функции closedir () (см. пример 6.53), возвращающей

#include <dirent. h>

int closedir (DIR *dirp);

Листинг 6.53. Описание функции closedir ().

Нередко чтение элементов каталога и сопоставление с шаблоном имен файлов сочетаются (см. выше раздел "Генерация маршрутных имен файлов"). Подобное сопоставление реализует функция fnmatch () (см. пример 6.54).

#include <fnmatch. h>

int fnmatch (const char *file_pattern,

const char *file_name, int flags);

Листинг 6.54. Описание функции fnmatch ().

На процесс сопоставления имени file_name с шаблоном file_pattern влияют следующие флаги:

FNM_PATHNAME

Трактовать имя file_name как маршрутное. Символу / в имени должен явным образом сопоставляться этот же символ в шаблоне (а не *,? или выражение в квадратных скобках). Если флаг не установлен, символ / трактуется наравне с другими.

FNM_NOESCAPE

При наличии этого флага символ \ трактуется наравне с другими. В противном случае он играет экранирующую роль.

FNM_PERIOD

Если этот флаг установлен, точка в начале имени файла должна сопоставляться с точкой в шаблоне. Иначе точка в начале имени сопоставляется на общих основаниях.

В случае успешного сопоставления функция fnmatch () возвращает ноль, при неудаче результат равен FNM_NOMATCH, в случае ошибки возвращается другое ненулевое значение.

В качестве примера употребления описанных функций рассмотрим программу, которая выводит имена файлов текущего каталога, удовлетворяющие заданным в командной строке шаблонам (см. пример 6.55).

#include <dirent. h>

#include <fnmatch. h>

#include <errno. h>

#include <stdio. h>

/* Программа сопоставляет имена файлов текущего каталога с заданными шаблонами */

#define SEARCH_DIR". "

static void match_names (DIR *dirp, const char *pattern) {

struct dirent *dp;

rewinddir (dirp);

while (errno = 0, (dp = readdir (dirp))! = NULL) {

if (fnmatch (pattern, dp->d_name, FNM_PERIOD) == 0) {

(void) printf (" %s\n", dp->d_name);

}

}

if (errno! = 0) {

perror ("Ошибка при чтении каталога " SEARCH_DIR);

}

}

int main (int argc, char *argv []) {

DIR *dirp;

int i;

if ( (dirp = opendir (SEARCH_DIR)) == NULL) {

perror ("Ошибка при открытии каталога " SEARCH_DIR);

return (-1);

}

for (i = 1; i < argc; i++) {

(void) printf ("Файлы каталога " SEARCH_DIR", удовлетворяющие шаблону %s\n", argv [i]);

match_names (dirp, argv [i]);

}

return (closedir (dirp));

}

Листинг 6.55. Пример использования функций, обрабатывающих каталоги.

Справедливости ради нужно отметить, что приведенный пример носит искусственный характер, поскольку для генерации маршрутных имен, удовлетворяющих заданному шаблону, стандартом POSIX-2001 предусмотрена функция glob () (см. пример 6.56).

#include <glob. h>

int glob (const char *restrict file_pattern,

int flags, int (*errfunc) (const char

*epath, int eerrno), glob_t *restrict pglob);

void globfree (glob_t *pglob);

Листинг 6.56. Описание функций glob () и globfree ().

Функция glob () сопоставляет все доступные маршрутные имена с шаблоном file_pattern и генерирует список успешно сопоставленных имен. Результаты своей работы функция glob () возвращает в структуре типа glob_t, содержащей, согласно стандарту, по крайней мере следующие поля:

size_t gl_pathc;

/* Число успешно сопоставленных маршрутных

имен */

char **gl_pathv;

/* Массив указателей на успешно сопоставленные

маршрутные имена */

size_t gl_offs;

/* Число элементов, которые нужно зарезерви-

ровать в начале массива gl_pathv */

Структура, на которую указывает аргумент pglob, должна создаваться приложением.

Другие области памяти, в том числе массив gl_pathv, резервируются функцией glob () по мере необходимости и освобождаются после обращения к globfree () с тем же значением pglob.

Работой функции glob () можно управлять с помощью следующих флагов.

GLOB_APPEND

Добавлять вновь сгенерированные маршрутные имена к предыдущим результатам функции glob ().

GLOB_DOOFFS

Принимать во внимание поле gl_offs. Если этот флаг установлен, то pglob->gl_pathv будет указывать на pglob->gl_offs пустых указателей, за которыми следуют pglob->gl_pathc указателей на маршрутные имена и завершающий пустой указатель.

GLOB_ERR

Завершать работу по достижении каталога, который не удается открыть или прочитать. Обычно в таких случаях функция glob () продолжает процесс генерации маршрутных имен.

GLOB_MARK

Добавлять символ / после имен успешно сопоставленных файлов, являющихся каталогами.

GLOB_NOCHECK

При отсутствии успешно сопоставленных имен возвращать шаблон.

GLOB_NOESCAPE

Запретить экранирование символом \.

GLOB_NOSORT

Не сортировать сгенерированные имена по алфавиту.

Если в процессе своей работы функция glob () достигает каталога, который не удается открыть или прочитать, а аргумент errfunc отличен от пустого указателя, то glob () вызывает (*errfunc ()) с двумя аргументами: "проблемным" маршрутным именем и соответствующим значением errno.

Если этот вызов возвращает значение, отличное от нуля, или если установлен флаг GLOB_ERR, генерация маршрутных имен завершается, значения полей pglob->gl_pathc и pglob->gl_pathv устанавливаются в соответствии с уже обработанными маршрутами, а результат вызова функции glob () полагается равным GLOB_ABORTED (при нормальном завершении возвращается 0).

Перепишем программу, которая выводит имена файлов, удовлетворяющие заданным в командной строке шаблонам, воспользовавшись функцией glob () (см. пример 6.57).

#include <glob. h>

#include <errno. h>

#include <stdio. h>

/* Программа выводит маршрутные имена, сгенерированные по заданным шаблонам */

static int errfunc (const char *epath, int eerrno) {

fprintf (stderr, "Ошибка при обработке каталога %s:", epath);

errno = eerrno;

perror (NULL);

return (0);

}

int main (int argc, char *argv []) {

glob_t gl_buf;

int i;

for (i = 1; i < argc; i++) {

(void) glob (argv [i], ( (i == 1)?

}

(void) printf ("Маршрутные имена, сгенерированные по заданным шаблонам: \n");

for (i = 0; (unsigned) i < gl_buf. gl_pathc; i++) {

(void) printf ("%s\n", gl_buf. gl_pathv [i]);

}

globfree (&gl_buf);

return (0);

}

Листинг 6.57. Пример программы, использующей функции glob () и globfree ().

Выше, при описании языка shell, мы рассматривали служебную программу basename. Ее логическим дополнением является утилита dirname:

dirname цепочка_символов

Она выдает на стандартный вывод имя каталога, в котором находится поименованный цепочкой символов файл.

Отметим, что цепочка символов трактуется служебной программой dirname как маршрутное имя только синтаксически: никаких проверок существования компонентов маршрутного имени не производится.

В качестве примера использования утилиты dirname приведем фрагмент командного файла, выполняемого при загрузке ОС Linux (см. пример 6.58).

if ["`dirname $RAW`" = "/dev/raw" - a - f /dev/raw]; then

echo $" Please correct your /etc/sysconfig/rawdevices: "

echo $" rawdevices are now located in the directory /dev/raw/ "

echo $" If the command 'raw' still refers to /dev/raw as a file. "

echo $" you'll have to upgrade your util-linux package"

exit

fi

Листинг 6.58. Пример использования служебной программы dirname.

Совместное использование утилит basename и dirname иллюстрирует пример 6.59. Это командный файл с одним аргументом - маршрутным именем компилируемого C-файла, которое может быть задано как с расширением. c, так и без него.

gcc - Wall - W - pedantic - o $ (basename "$1". c)

$ (dirname "$1") /$ (basename "$1". c). c

Листинг 6.59. Пример совместного использования служебных программ basename и dirname.

Размещено на Allbest.ru

...

Подобные документы

  • Текстовый редактор - приложение для обработки текстовой информации. Описание текстовых процессоров как более совершенных текстовых редакторов. Типы текстовых файлов: форматированные, неформатированные. Основные правила редактирования и набора текста.

    презентация [747,3 K], добавлен 26.11.2010

  • Понятие синтаксического анализа. Программный продукт для обработки данных строкового типа. Построение сканера текстов с использованием утилиты flex, синтаксического анализатора с помощью утилиты bison. Грамматика языка программирования обработки строк.

    курсовая работа [261,7 K], добавлен 29.10.2012

  • Работа с файлами, каталогами и томами в Windows и Win32 API. Функции GetWindowsDirectory и GetSystemDirectory. Примеры работы с томами. Получение и изменение атрибутов файлов. Описание минимального набора базовых функций Windows. Чтение и запись файлов.

    лекция [62,7 K], добавлен 24.06.2009

  • Изучение основных правил проектирования операционных систем. Структура файловой системы. Компоненты, обеспечивающие способы организации, поиска и управления информацией. Краткий обзор специальных и обыкновенных файлов. Основные команды системы UNIX.

    методичка [36,4 K], добавлен 02.12.2009

  • Утилиты архивации для создания резервных копий файлов путем помещения их в архив в сжатом виде. Операции над архивами. Алгоритмы архивации. Универсальные алгоритмы уплотнения. Формат задания команд. Степень сжатия файлов. Основные виды архиваторов.

    презентация [241,0 K], добавлен 13.08.2013

  • Основные средства и технологии обработки и редактирования текстовых документов, принципы их использования. Характеристика функциональных возможностей текстового процессора Ms. Word. Описание дополнительных возможностей текстового редактора Word 2003.

    курсовая работа [1,4 M], добавлен 19.03.2011

  • Иерархическая структура файловой системы Unix. Согласованная обработка массивов данных, возможность создания и удаления файлов, буферный кэш. Защита информации, трактовка периферийных устройств как файлов. Внутренняя структура файловой системы Unix.

    реферат [102,2 K], добавлен 23.03.2010

  • Обработка текстовых данных, хранящихся в файле. Задачи и алгоритмы обработки больших массивов действительных и натуральных чисел. Практические задачи по алгоритмам обработки данных. Решение задачи о пяти ферзях. Программа, которая реализует сортировку Шел

    курсовая работа [29,2 K], добавлен 09.02.2011

  • Понятия файлов и каталогов. Область внешней памяти, группа файлов на одном носителе. Древовидная структура файлов на диске. Имя и местонахождение файла. Маршрут или путь по файловой системе. Запись имени файла в DOSе. Шаблоны. Структура каталога.

    лабораторная работа [15,2 K], добавлен 30.09.2008

  • Базовые инструменты Linux Shell и Make. Скриптовый язык Shell. Make как утилита, автоматизирующая процесс преобразования файлов из одной формы в другую. Встраиваемые системы Buildroot и OpenWrt на базе Linux. Переменные и блоки define BuildPackage.

    курсовая работа [27,4 K], добавлен 19.01.2016

  • Обзор различных методик и программ кодировки информации. Восстановление поврежденных файлов. Конфиденциальность и контроль за личными сведениями. Преобразование форматов файлов и способов кодировки. Утилиты - конвертеры и перекодировщики. Windows Vista.

    курсовая работа [283,4 K], добавлен 14.11.2008

  • Специальные клавиши на клавиатуре. Составление шаблонов имен при поиске файлов. Описание и функции объекта "Мой компьютер". Способы выделения группы файлов. Этапы настройки часов. Средства работы с буфером обмена. Основные функции электронной почты.

    контрольная работа [578,8 K], добавлен 14.04.2013

  • Использование программы "Total Commander": пользовательский интерфейс, клавиатурные сочетания, операции с файлами, контекстные меню, внутренний просмотр файлов. Назначение и применение функциональных клавиш. Особенности работы с каталогами и файлами.

    презентация [462,3 K], добавлен 25.09.2014

  • Основные типы файлов Word. Режимы отображения документа. Преимущества стилевого оформления документов. Основные сведения о шрифтах. Средства автоматизации обработки текста в MS Word. Использование объектов OLE. Порядок сохранения файлов, выбор папки.

    презентация [1,9 M], добавлен 17.12.2014

  • Классификация и возможности текстовых редакторов. Среда текстового редактора Microsoft Word 2003. Процесс редактирования текста, его копирование и перемещение. Проверка орфографии и синтаксиса, автотекст и автозамена. Пример гипертекстового документа.

    курсовая работа [2,4 M], добавлен 25.04.2013

  • Общие сведения о графической информации. Характеристика растровой, векторной и демонстрационной графики. Обзор программ обработки и просмотра графических изображений Paint, Adobe Photoshop, MS Power Point, ACDSee. Возможности графических редакторов.

    курсовая работа [55,7 K], добавлен 01.07.2010

  • Работа с объектами операционной системы Windows: основные понятия и горячие клавиши. Создание и редактирование файлов и папок. Скриншоты и графический редактор Paint. Редактирование простейших текстовых документов в Блокноте. Работа с калькулятором.

    лабораторная работа [16,6 K], добавлен 30.11.2010

  • Компиляция программ на языке C/C++. Компиляция нескольких файлов. Библиотеки объектных файлов. Создание статической и динамической библиотеки. Функции работы. Создание динамической библиотеки для решения системы линейных уравнений.

    курсовая работа [27,4 K], добавлен 07.08.2007

  • Изучение основных этапов программирования на ассемблере, который является символическим представлением машинного языка, то есть каждой машинной команде соответствует команда ассемблера. Реализация алгоритма выполнения программы для просмотра bmp файлов.

    курсовая работа [248,0 K], добавлен 25.12.2012

  • Разработка удаленной базы данных и приложения-клиента для доступа к электронным источникам литературы, содержащихся на жестком диске сервера предприятия в виде упакованных архивов файлов и пакетов файлов. Реляционное исчисление доменов. Средства Delphi.

    дипломная работа [2,7 M], добавлен 24.03.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.