-depth
Начальная школа до find
заставляет его выполнить поиск в глубине.
Однако последовательность по умолчанию - это не поиск в ширину.
Последовательность по умолчанию может быть неофициально описана как «обход в глубину, который обрабатывает узлы, когда они впервые встречаются, а не во время обратного отслеживания».
Я действительно нуждаюсь в ширине первого поиска. Как я могу заставить find
себя так себя вести?
Для иллюстрации со следующей настройкой:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find
имеет следующее поведение по умолчанию:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
и -depth
он выполняет следующее:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Тем не менее, я хочу следующую (фиктивную) опцию:
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
Другими словами, мне нужно find
обработать / сообщить обо всех файлах / каталогах на заданной глубине, прежде чем продолжить.
Как я могу это сделать?
find
(по крайней мере, не толькоfind
). Вы хотите только перечислить файлы, или вы хотите использовать другие праймериз?-bfs
это не совсем то, что мне нужно ... У меня есть простой скрипт, который генерирует индекс для большого проекта GitLab, подходящий для включения в GitLab Wiki. Это делает заголовки иерархически основанными на именах каталогов. Он прекрасно работает, за исключением того, что в приведенной выше структуре файла примера он помещаетсяdelta
подcharlie
подзаголовком, а не под родительскимalpha
заголовком.find
выход в алфавитном порядке. Понятия не имею почему ...-bfs
может пригодиться, даже если это не совсем подходит для этого варианта использования.Ответы:
Вы можете сделать это только с подстановочными знаками оболочки. Создайте шаблон с постепенно увеличивающимся уровнем каталогов.
Это пропускает точечные файлы. Используйте
FIGNORE='.?(.)'
в ksh,shopt -s dotglob
в bash илиsetopt glob_dots
в zsh, чтобы включить их.Предостережения:
Если вы хотите выбрать порядок или каталоги и не-каталоги, а производительность не критична, вы можете сделать два прохода и протестировать
[ -d "$file" ]
каждый проход.источник
*
. :)nullglob
и используйте(($#))
в качестве условия цикла, чтобы избежать этого крайнего случая.# cat ./bfind
Это работает путем увеличения глубины
find
и повторения, я думаю, что это может повторить результаты, но может быть легко отфильтрованоисточник
Вы можете
find
отсортировать данные по типу, который сортируется в основном по количеству/
символов в пути. Например,Используется
awk
для добавления префикса к пути с количеством слешей иsed
удаления этого префикса в конце.На самом деле, поскольку вы, вероятно, хотите, чтобы содержимое каталога
alpha/charlie+
было указано послеalpha/charlie
, вам нужно сказатьsort -t/ -k1,1 -k2,2 -k3,3 -k4,4
до желаемой глубины.источник
Другой ответ, основанный не на 'find', а на bash - сначала используйте "длину родительского каталога", затем сортируйте по альфе.
Ответ не совсем совпадает, так как ваши результаты имеют "Чарли, Браво, Дельта", но мне было интересно, должно ли это быть "Браво, Чарли, Дельта" в альфа-порядке.
Что производит
источник