Вопрос по bash, linux – Может ли «найти» или любой другой инструмент поиска файлов в ширину?

29

Иногда я знаю, что файл не так глубоко, но очень плотный подкаталог не позволяет мне легко найти нужные файлы.

Можнонаходить (или любой другой инструмент) искать файлы, используя поиск в ширину?

Если вы все еще ищете такую вещь, я написалthis Tavian Barnes
И освоить «чернослив» вариантfind Командуй, пока ты у него. Нет смысла ввязываться в какой-то глубинный рекурсивный поиск какого-либо глубоко укоренившегося, очень заполненного поддерева каталогов, когда вы знаете объект - файл или каталог - который вы ищете там. Vietnhi Phuvan

Ваш Ответ

5   ответов
17

Да вроде.

Вы можете использовать-depth возможность заставить его обрабатывать содержимое каталога до самого каталога. Вы также можете использовать-maxdepth возможность ограничить, сколько каталогов вниз он будет сверлить.

Это еще не первый поиск. Это только ограниченная глубина первого поиска. Поиск вначале с ограниченной глубиной действительно решает проблему поиска «файла [который] не настолько глубок», но, тем не менее, это определенно не поиск в ширину.
& quot; вид & quot; Правильно - это все еще не настоящий поиск в ширину, так как a / b / c будет посещен до a / d. Впрочем, достаточно для большинства целей.
5

Поиск в ширину, использующий переменную в качестве своей очереди.

Создайтеbfs.sh

#!/bin/bash

queue="$1"
shift

while [ -n "$queue" ]
do
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $*
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d`
done

Сделайте его исполняемым:

$ chmod u+x ./bfs.sh

Тогда вы можете сделать поиск в ширину:

$ ./bfs.sh /path/to/somewhere -name foobar

4

использованиеfind с--maxdepth вариант.

Это наСправочники раздел на вашей справочной странице; может найти другие варианты, более подходящие в зависимости от ваших потребностей.

Чтобы достичь точного поиска в ширину, вам нужно будет выполнить цикл со смешанным--mindepth а также--maxdepth опции. Но я не думаю, что нужно быть таким точным, обычно достаточно ограниченного поиска.

0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n  | awk '{print $2}' | xargs grep -d skip "search term"

Он использует поиск, чтобы перечислить все файлы. Первая команда awk подсчитывает все символы "/"; персонажи. Он сортирует по количеству, а затем отбрасывает столбец подсчета. Наконец, он использует xargs для поиска в отсортированном списке файлов.

Это действительно безобразно.

10

Ужасный взлом, не буду работать с-0 или любые действия, кроме-print, неэффективные и т. д. и т. д. & # x2026;

#!/bin/bash
i=0
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do
    echo "$results"
    ((i++))
done

В основном это просто работает

find -mindepth 0 -maxdepth 0
find -mindepth 1 -maxdepth 1
find -mindepth 2 -maxdepth 2
…………………………………………………………………………

до тех порfind возвращает ненулевой статус или ничего не печатает.

Похожеiterative depth-first search мне...
Однако обратите внимание, что если вы выполняете какую-либо значительную обработку на каждом узле, разница между BFS и IDFS для конкретного пространства поиска может быть значительной.
@MattLuongo: По вашей ссылке: & quot; IDDFS эквивалентна поиску в ширину, но использует гораздо меньше памяти; & quot;
Мини гольф:for((i=0;1;i++));do find -mindepth $i -maxdepth $i|grep .||break;done
@ MooingDuck Я не согласен с тем, что это работает, просто указав, что у него есть конкретное имя. IDFS также медленнее, чем BFS, так как каждый раз требует повторного обхода предыдущего уровня дерева. Аргумент, который я слышал, состоит в том, что в большинстве задач поиска стоимость времени выполнения зависит от стоимости обхода.n+1так что это часто стоит.

Похожие вопросы