Или вы можете очистить входной буфер, чтобы прочитать строку
fflush (stdin)
blockquote>, она определена в заголовке stdio.h .
Этот код работает ..
cout << "Enter the number: "; int number; cin >> number; cout << "Enter names: "; string names; fflush(stdin); //FLUSHING STDIN getline(cin, names);
Без заслуженного упорядочивания: найдите, что-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"
Затем можно назвать этот сценарий с базовым каталогом параметров и глубиной.
Я пытался найти способ сделать это с 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
Я не думаю, что Вы могли сделать это с помощью встроенных утилит, с тех пор при пересечении иерархии каталогов, Вы почти всегда хотите поиск в глубину, или сверху вниз или вверх дном. Вот сценарий 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))
Редактирование:
os.path
- модуль вместо os.stat
- функционируют и stat
- модуль. list.pop
и list.extend
вместо del
и +=
операторы. Вот возможный путь, использование находят. Я не полностью протестировал его, таким образом, пользователь остерегается...
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
Что-то вроде этого:
find . -type d |
perl -lne'push @_, $_;
print join $/,
sort {
length $a <=> length $b ||
$a cmp $b
} @_ if eof'
Если Вы хотите сделать это с помощью стандартных инструментов, следующий конвейер должен работать:
find . -type d | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2
Таким образом,
Для ограничения найденной глубины добавьте-maxdepth аргумент команде находки.
Если Вы хотите каталоги, перечисленные в том же порядке, которые находят вывод ими, используют "вид-n-s" вместо "вида-n"; флаг "-s" стабилизирует вид (т.е. сохраняет входной порядок среди объектов, которые выдерживают сравнение одинаково).