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

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

Жанры

Разработка приложений в среде 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 может послать программе сигнал о модификации каталога, позволяя своевременные обновления без накладных расходов и задержек на страничный обмен.

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

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Мастер клинков. Начало пути

Распопов Дмитрий Викторович
1. Мастер клинков
Фантастика:
фэнтези
9.16
рейтинг книги
Мастер клинков. Начало пути

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Рождение победителя

Каменистый Артем
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Рождение победителя

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь