Я пытался найти способ сделать это с 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
Не могли бы вы остановиться на этом, чтобы включить ваш язык по выбору, а также ОС –
Arg (Linux?)! Это вопрос сообщества wiki. Раздражает. –
Что делает этот вопрос вики сообщества? –