Я пытался найти способ сделать это с find
, но, похоже, у него нет ничего похожего на -breadth
. Если не написать патч для него, попробуйте следующее заклинание оболочки (для bash):
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
Я случайно наткнулся на это, так что я не знаю, работает ли он вообще (я тестировал его только на конкретной структуре каталогов, о которой вы спрашивали)
Если вы хотите ограничить глубину, поместите переменную counter во внешний цикл, например, так (я также добавляю комментарии к этому):
# 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