Одесса: 6°С (вода 9°С)
Киев: 1°С
Львов: -1°С

Тема: С под Линух

Ответить в теме
Показано с 1 по 15 из 15
  1. Вверх #1
    Новичок
    Пол
    Мужской
    Возраст
    29
    Сообщений
    35
    Репутация
    11

    Exclamation С под Линух

    Стала задача посчитать кол-во файлов в поддереве дерикторий начиная с дериктории укзанной с командной строки.
    Если есть у кого интерес помочь пишите. буду благодарен, код есть но ни как не могу довести до ума...


  2. Вверх #2
    Посетитель Аватар для di:)
    Пол
    Женский
    Возраст
    27
    Сообщений
    142
    Репутация
    20
    в консоли через комбинацию du и wc не получается? 1 строка текста )
    если делать универсальный вариант - ещё + пара строк

    можно так: find $directory | wc -l

    2 root:
    проверила под freebsd: работает!
    под дебианом: работает
    из того, что просмотрела: в результатах поиска папка тоже занимает 1 строчку.
    так что, действительно, результат ошибочен - надо отнять количество подпапок.
    Последний раз редактировалось di:); 01.03.2010 в 21:45. Причина: работать-то работает, но есть ошибка.

  3. Вверх #3
    Посетитель
    Пол
    Мужской
    Возраст
    27
    Сообщений
    132
    Репутация
    16
    PHP код:
    #include <dirent.h>
    #include <stdio.h>
    int main(int argccharargv[]) {
        if(
    argc == 1) {
            
    printf("./main <foulder>");
            return 
    0;
        }
        
    int i 0;
        
    DIR *listdir NULL;
        
    listdir opendir (argv[i]);
        while (
    readdir (listdir))
               
    i++;
        
    printf("%i",i);
        return 
    0;

    подсчет всего содержимого каталога (учитываються также "." и "..")

    di - почему-то ваша рекомандация не работает.
    Последний раз редактировалось rооt; 01.03.2010 в 21:13.
    Жизнь в стиле Debian уже отучила меня собирать что-либо самостоятельно

  4. Вверх #4
    Посетитель Аватар для Rector
    Пол
    Мужской
    Возраст
    30
    Сообщений
    215
    Репутация
    26
    ls -lR $dir | grep '^[-]' | wc -l
    похоже на первый вариант, только подпапки не считает - выбирает только файлы

  5. Вверх #5
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    1,051
    Репутация
    185
    Цитата Сообщение от di:) Посмотреть сообщение
    из того, что просмотрела: в результатах поиска папка тоже занимает 1 строчку.
    так что, действительно, результат ошибочен - надо отнять количество подпапок.
    Зачем вычитать? Просто не считать
    Код:
    find дир -type f | wc -l

  6. Вверх #6
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    1,051
    Репутация
    185
    Цитата Сообщение от Rector Посмотреть сообщение
    ls -lR $dir | grep '^[-]' | wc -l
    похоже на первый вариант, только подпапки не считает - выбирает только файлы
    Ну, парсить форматированный для человека вывод - это некошерно
    Тем более, что ваш вариант не работает, если $dir начинается с "-".

  7. Вверх #7
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    1,051
    Репутация
    185
    Впрочем если $dir начинается с "-", то и find не сработает

  8. Вверх #8
    Посетитель Аватар для Rector
    Пол
    Мужской
    Возраст
    30
    Сообщений
    215
    Репутация
    26
    ls -l вывводит в первом столбце атрибуты. У директории на первом месте стоит d, у ссылки l, а вот у файлов именно прочерк.
    так что все будет работать

  9. Вверх #9
    Посетитель Аватар для Rector
    Пол
    Мужской
    Возраст
    30
    Сообщений
    215
    Репутация
    26
    а вот по скорости работы всетаки find будет быстрее )

    time ls -lR /etc|grep '^[-]'| wc -l
    real 0m0.077s
    user 0m0.040s
    sys 0m0.052s

    time find /etc -type f | wc -l

    real 0m0.048s
    user 0m0.008s
    sys 0m0.040s

  10. Вверх #10
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    1,051
    Репутация
    185
    Цитата Сообщение от Rector Посмотреть сообщение
    ls -l вывводит в первом столбце атрибуты. У директории на первом месте стоит d, у ссылки l, а вот у файлов именно прочерк.
    так что все будет работать
    ls -lR перед содержимым каждого каталога выводит его имя в отдельной строке. Если в этом имени первый символ будет "-" то ваш скрипт его добавит к числу файлов.

  11. Вверх #11
    Посетитель Аватар для di:)
    Пол
    Женский
    Возраст
    27
    Сообщений
    142
    Репутация
    20
    Цитата Сообщение от Rector Посмотреть сообщение
    time find /etc -type f | wc -l
    +к тому, что надо знать встроенные возможности, они часто лучше всего будут отлажены и оптимизированы
    иначе, прийдётся всегда думать, с какой буквы начинаются папки и как отнять число подпапок ))

  12. Вверх #12
    Посетитель Аватар для Rector
    Пол
    Мужской
    Возраст
    30
    Сообщений
    215
    Репутация
    26
    Цитата Сообщение от 18-я весна Посмотреть сообщение
    ls -lR перед содержимым каждого каталога выводит его имя в отдельной строке. Если в этом имени первый символ будет "-" то ваш скрипт его добавит к числу файлов.
    Ну тут не совсем верно
    Если запустить ls -lR в текущем каталоге, то в первой строке выведется например ./home, т.е. начинаться будет с точки, но никак не с "-"
    Если запустить ls -lR /etc/, то начинаться будет со /, т.е. опять же не с "-"

    Так что я тут не вижу, в каком случае можно напороться на дефис в названии файла.
    Насчет внутренних возможностей - да, это правильно и хорошо их знать, но *nix системы тем и хороши, что одно и тоже действие можно выполнить несколькими способами. Например ls входит в пакет coreutils, которые есть всегда, а вот find'a в нужный момент может не оказаться (чисто теоретически).

  13. Вверх #13
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    1,051
    Репутация
    185
    Цитата Сообщение от Rector Посмотреть сообщение
    Ну тут не совсем верно
    Если запустить ls -lR в текущем каталоге, то в первой строке выведется например ./home, т.е. начинаться будет с точки, но никак не с "-"
    Если запустить ls -lR /etc/, то начинаться будет со /, т.е. опять же не с "-"
    Вот простейший пример:
    Код:
    $ DIR=-
    $ mkdir $DIR
    $ ls -lR $DIR | grep '^-' | wc -l
    1 (а должно быть 0)
    В жизни конечно такое не встречается, т.к. знак "-" активно используется в ключах утилит и его избегают в начале имени файлов/каталогов применять.
    На этом предлагаю завершить эту тему.

  14. Вверх #14
    Посетитель Аватар для Rector
    Пол
    Мужской
    Возраст
    30
    Сообщений
    215
    Репутация
    26
    Вы привели единственный возможный случай )))
    Ну раз тему закрываем, так закрываем

  15. Вверх #15
    ROTOR_
    гость
    Rector, а у Вас есть опыт работы с Высшими чинами?
    Там просто эти команды не нужны.

    p.s. да и девушка никак не может обработать голландского клиента


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения