Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

14.7.3. Реализация

find

Команда

find
выполняет в одном или нескольких деревьях каталогов поиск файлов, соответствующих определенным характеристикам. Ниже приведена простая реализация
find
, реализованная на основе
nftw
. Она использует
fnmatch
(см. главу 23) для реализации переключателя
– name
и иллюстрирует многие флаги, воспринимаемые
nftw
.

 1: /* find.с */

 2:

 3: #define _XOPEN_SOURCE 600

 4:

 5: #include <fnmatch.h>

 6: #include <ftw.h>

 7: #include <limits.h>

 8: #include <stdio.h>

 9: #include <stdlib.h>

10: #include <string.h>

11:

12: const char * name = NULL;

13: int minDepth = 0, maxDepth = INT_MAX;

14:

15: int find (const char * file, const struct stat * sb, int flags,

16: struct FTW * f) {

17: if (f->level < minDepth) return 0;

18: if (f->level > maxDepth) return 0;

19: if (name && fnmatch(name, file + f->base, FNM_PERIOD)) return 0;

20:

21: if (flags == FTW_DNR) {

22: fprintf(stderr, "find: %s:
недопустимые полномочия\n", file);

23: } else {

24: printf("%s\n", file);

25: }

26:

27: return 0;

28: }

29:

30: int main(int argc, const char ** argv) {

31: int flags = FTW_PHYS;

32: int i;

33: int problem = 0;

34: int tmp;

35: int rc;

36: char * chptr;

37:

38: /* поиск первого параметры командной строки (который должен

39: находиться после списка путей */

40: i = 1;

41: while (i < argc && *argv[i] != '-') i++;

42:

43: /* обработать опции командной строки */

44: while (i < argc && !problem) {

45: if (!strcmp(argv[i], "-name")) {

46: i++;

47: if (i == argc)

48: problem = 1;

49: else

50: name = argv[i++];

51: } else if (!strcmp(argv[i], "-depth")) {

52: i++;

53: flags |= FTW_DEPTH;

54: } else if (!strcmp (argv[i], "-mount") ||

55: !strcmp(argv[i], "-xdev")) {

56: i++;

57: flags |= FTW_MOUNT;

58: } else if (!strcmp (argv[i], "-mindepth") ||

59: !strcmp (argv[i], "-maxdepth")) {

60: i++;

61: if (i == argc)

62: problem = 1;

63: else {

64: tmp = strtoul(argv[i++], &chptr, 10);

65: if (*chptr)

66: problem = 1;

67: else if (!strcmp(argv[i - 2], "-mindepth"))

68: minDepth = tmp;

69: else

70: maxDepth = tmp;

71: }

72: }

73: }

74:

75: if (problem) {

76: fprintf(stderr, "использование: find <пути> [-name <строка>]"

77: "[-mindepth <целое>] [-maxdepth <целое>]\n");

78: fprintf(stderr, " [-xdev] [-depth]\n");

79: return 1;

80: }

81:

82: if (argc == 1 || *argv[1] == '-') {

83: argv[1] = ".";

84: argc = 2;

85: }

86:

87: rc = 0;

88: i = 1;

89: flags = 0;

90: while (i < argc && *argv[i] != '-')

91: rc |= nftw (argv [i++], find, 100, flags);

92:

93: return rc;

94: }

14.8.

Уведомление о смене каталога

Иногда приложения желают получать уведомления об изменении оглавления каталога. Например, диспетчеры файлов могут выводить оглавление каталога в окне и обновлять это окно каждый раз при изменении каталога другими программами. В то время как приложение регулярно перепроверяет каталог, Linux может послать программе сигнал о модификации каталога, позволяя своевременные обновления без накладных расходов и задержек на страничный обмен.

Поделиться:
Популярные книги

Назад в СССР: 1986 Книга 5

Гаусс Максим
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Назад в СССР: 1986 Книга 5

Неудержимый. Книга III

Боярский Андрей
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Наследник Четырех

Вяч Павел
5. Игра топа
Фантастика:
героическая фантастика
рпг
6.75
рейтинг книги
Наследник Четырех

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Идеальный мир для Лекаря 11

Сапфир Олег
11. Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 11

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Нефилим

Демиров Леонид
4. Мания крафта
Фантастика:
фэнтези
боевая фантастика
рпг
7.64
рейтинг книги
Нефилим

Бывший муж

Рузанова Ольга
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Бывший муж