Как я рекурсивно перечисляю все каталоги в местоположении, в ширину?

Или вы можете очистить входной буфер, чтобы прочитать строку

fflush (stdin)

, она определена в заголовке stdio.h .

Этот код работает ..

cout << "Enter the number: ";
int number;
cin >> number;

cout << "Enter names: ";
string names;
fflush(stdin);  //FLUSHING STDIN
getline(cin, names);
29
задан 5 revs 12 February 2009 в 04:11
поделиться

6 ответов

Без заслуженного упорядочивания: найдите, что-maxdepth - тип d

получает заслуженное упорядочивание, необходимо сделать рекурсию сами с этим маленьким сценарием оболочки:

#!/bin/bash
r () 
{
    let level=$3+1
    if [ $level -gt $4 ]; then return 0; fi
    cd "$1"
    for d in *; do
        if [ -d "$d" ]; then
            echo $2/$d
        fi;
    done
    for d in *; do
        if [ -d "$d" ]; then
            (r "$d" "$2/$d" $level $4)
        fi;
    done
}
r "$1" "$1" 0 "$2"

Затем можно назвать этот сценарий с базовым каталогом параметров и глубиной.

2
ответ дан 4 revs 14 October 2019 в 07:21
поделиться

Я пытался найти способ сделать это с find, но это, кажется, не имеет ничего как -breadth опция. За исключением записи патча для него, попробуйте следующее колдовство оболочки (за удар):

LIST="$(find . -mindepth 1 -maxdepth 1 -type d)";
while test -n "$LIST"; do
    for F in $LIST; do
        echo $F;
        test -d "$F" && NLIST="$NLIST $(find $F -maxdepth 1 -mindepth 1 -type d)";
    done;
    LIST=$NLIST;
    NLIST="";
done

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

, Если Вы хотите ограничить глубину, поместить переменную счетчика во внешний цикл, как так (я также добавляю комментарии к этому):

# initialize the list of subdirectories being processed
LIST="$(find . -mindepth 1 -maxdepth 1 -type d)";
# initialize the depth counter to 0
let i=0;
# as long as there are more subdirectories to process and we haven't hit the max depth
while test "$i" -lt 2 -a -n "$LIST"; do
    # increment the depth counter
    let i++;
    # for each subdirectory in the current list
    for F in $LIST; do
        # print it
        echo $F;
        # double-check that it is indeed a directory, and if so
        # append its contents to the list for the next level
        test -d "$F" && NLIST="$NLIST $(find $F -maxdepth 1 -mindepth 1 -type d)";
    done;
    # set the current list equal to the next level's list
    LIST=$NLIST;
    # clear the next level's list
    NLIST="";
done

(заменяют 2 в -lt 2 с глубиной)

В основном это реализует стандартный алгоритм поиска в ширину с помощью $LIST и $NLIST как очередь имен каталогов. Вот последний подход как острота для легкой копии-и-вставки:

LIST="$(find . -mindepth 1 -maxdepth 1 -type d)"; let i=0; while test "$i" -lt 2 -a -n "$LIST"; do let i++; for F in $LIST; do echo $F; test -d "$F" && NLIST="$NLIST $(find $F -maxdepth 1 -mindepth 1 -type d)"; done; LIST=$NLIST; NLIST=""; done
3
ответ дан 3 revs 14 October 2019 в 07:21
поделиться

Я не думаю, что Вы могли сделать это с помощью встроенных утилит, с тех пор при пересечении иерархии каталогов, Вы почти всегда хотите поиск в глубину, или сверху вниз или вверх дном. Вот сценарий Python, который даст Вам поиск в ширину:

import os, sys

rootdir = sys.argv[1]
queue = [rootdir]

while queue:
    file = queue.pop(0)
    print(file)
    if os.path.isdir(file):
        queue.extend(os.path.join(file,x) for x in os.listdir(file))

Редактирование:

  1. Используя os.path - модуль вместо os.stat - функционируют и stat - модуль.
  2. Используя list.pop и list.extend вместо del и += операторы.
5
ответ дан 3 revs, 2 users 75% 14 October 2019 в 07:21
поделиться

Вот возможный путь, использование находят. Я не полностью протестировал его, таким образом, пользователь остерегается...

depth=0
output=$(find . -mindepth $depth -maxdepth $depth -type d | sort); 
until [[ ${#output} -eq 0 ]]; do 
  echo "$output"
  let depth=$depth+1
  output=$(find . -mindepth $depth -maxdepth $depth -type d | sort)
done
1
ответ дан Rog 14 October 2019 в 07:21
поделиться

Что-то вроде этого:

find . -type d | 
  perl -lne'push @_, $_;
    print join $/,
      sort { 
        length $a <=> length $b || 
          $a cmp $b 
        } @_ if eof'
0
ответ дан Dimitre Radoulov 28 November 2019 в 01:01
поделиться

Если Вы хотите сделать это с помощью стандартных инструментов, следующий конвейер должен работать:

find . -type d | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2

Таким образом,

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

Для ограничения найденной глубины добавьте-maxdepth аргумент команде находки.

Если Вы хотите каталоги, перечисленные в том же порядке, которые находят вывод ими, используют "вид-n-s" вместо "вида-n"; флаг "-s" стабилизирует вид (т.е. сохраняет входной порядок среди объектов, которые выдерживают сравнение одинаково).

23
ответ дан Emil Sit 28 November 2019 в 01:01
поделиться