Перечислите все листовые подкаталоги в Linux

Некоторые из других ответов имели бы низкую производительность на очень больших массивах, потому что методы как removeObject: и removeObjectsInArray: включают выполнение линейного поиска получателя, который является отходами, потому что Вы уже знаете, где объект. Кроме того, любой вызов к removeObjectAtIndex: должен будет скопировать значения с индекса до конца массива одним слотом за один раз.

более эффективный было бы следующим:

NSMutableArray *array = ...
NSMutableArray *itemsToKeep = [NSMutableArray arrayWithCapacity:[array count]];
for (id object in array) {
    if (! shouldRemove(object)) {
        [itemsToKeep addObject:object];
    }
}
[array setArray:itemsToKeep];

, поскольку мы устанавливаем способность itemsToKeep, мы не тратим впустую значений копирования времени во время изменения размеры. Мы не изменяем массив на месте, таким образом, мы свободны использовать Быстрое Перечисление. Используя setArray: для замены содержания array с itemsToKeep будет эффективно. В зависимости от Вашего кода Вы могли даже заменить последнюю строку:

[array release];
array = [itemsToKeep retain];

, Таким образом, нет даже потребности скопировать значения, только подкачайте указатель.

14
задан Michael Myers 15 October 2009 в 19:12
поделиться

5 ответов

find . -type d | sort | awk '$0 !~ last "/" {print last} {last=$0} END {print last}'
11
ответ дан 1 December 2019 в 08:53
поделиться

Я не могу придумать ничего, что могло бы сделать это без цикла. Итак, вот несколько циклов:

Это отображает конечные каталоги в текущем каталоге, независимо от их глубины:

for dir in $(find -depth -type d); do [[ ! $prev =~ $dir ]] && echo "$dir" ; prev="$dir"; done

Эта версия правильно обрабатывает имена каталогов, содержащие пробелы:

saveIFS=$IFS; IFS=$'\n'; for dir in $(find -depth -type d ); do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done; IFS=$saveIFS

Вот версия, использующая Jefromi :

find -depth -type d | while read dir;  do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done
4
ответ дан 1 December 2019 в 08:53
поделиться

Вот скрипт Python , который действительно работает . Недавно мне пришлось сделать то же самое!

)
  • \) - конечная группа захвата
  • \ / - косая черта (/) (экранированная с помощью \ )
  • . * - ноль или более любого символа
  • \ n - новая строка
  • \ 1 - копия обратной ссылки (в данном случае это все, что было между началом строки и последней косой чертой)
  • $ - соответствует концу строки
  • / - завершает шаблон
  • 0
    ответ дан 1 December 2019 в 08:53
    поделиться

    Если вы ищете что-то визуальное, tree -d подойдет.

    drinks
    |-- coke
    |   |-- cherry
    |   `-- diet
    |       |-- caffeine-free
    |       `-- cherry
    |-- juice
    |   `-- orange
    |       `-- homestyle
    |           `-- quart
    `-- pepsi
        |-- clear
        `-- diet
    
    5
    ответ дан 1 December 2019 в 08:53
    поделиться

    Я думаю, вы можете просмотреть все каталоги, а затем перенаправить вывод и использовать xargs для подсчета количества файлов для каждого подкаталога, когда нет подкаталога (xargs find SUBDIR -type d | wc - л ... что-то в этом роде, я не могу сейчас проверить) вы нашли лист.

    Это все еще цикл.

    0
    ответ дан 1 December 2019 в 08:53
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: