опция в ширину в утилите Linux `find?


12

Есть ли какая-либо опция ширины / глубины в утилите Linux для поиска?

Ответы:


5

Там нет ничего встроенного, чтобы найти, даже GNU найти. Вы можете постобработать вывод findсортировки по количеству слешей, например, с помощью Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> список всех входных строк;
  • $a =~ s!/!/!gколичество косых черт $a, которое мы используем в качестве критерия сортировки.

Если вы можете использовать Zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* перечисляет все файлы в текущем каталоге и подкаталогах.
  • Материал внутри скобок является глобальным классификатором.
  • Квалификатор glob oeуправляет порядком, в котором возвращаются совпадения: они сортируются по значению REPLYпосле выполнения здесь кода в кавычках для каждого совпадения, для которого REPLYизначально задан совпадающий путь.
  • Указанный код преобразуется, $REPLYчтобы удалить все, кроме слэшей. Таким образом, результат состоит из всего на глубине 1 (пустой результат $REPLY), затем всего на глубине 2 ( $REPLYзаканчивается /), глубине 3 ( //) и т. Д.

1
Процесс сортировки очень интересен, однако сортировка требует завершения поиска, и у вас не будет возможности контролировать разрыв.
Xiè Jìléi


1

Я чувствую, что вы можете. Он включает в себя grep и подобные, и цикл, но я считаю, что он работает очень хорошо, особенно для вашего случая, когда поиск не нужно завершать.

Это более ресурсоемкий из-за:

  • Много разветвления
  • Много находок
  • Каждый каталог до текущей глубины будет найден столько раз, сколько общей глубины для структуры файла (это не должно быть проблемой, если у вас есть практически любое количество оперативной памяти ...)

Это хорошо, потому что:

  • Он использует Bash и базовые инструменты GNU
  • Он может быть сломан, когда вы захотите (как будто вы видите, что искали)
  • Он работает для каждой строки, а не для поиска, поэтому последующим командам не нужно ждать поиска и сортировки.
  • Он работает на основе фактического разделения файловой системы, поэтому, если у вас есть каталог с косой чертой, он не будет указан глубже, чем он есть; если у вас настроен другой разделитель пути, все в порядке.
#! / Bin / Баш 
Глубина = 0

в то время как найти -mindepth $ глубину -maxdepth $ глубину | grep '.'
делать
    глубина = $ ((глубина + 1))
сделано

Вы также можете легко (?) Поместить его в одну строку:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Но я предпочитаю небольшие сценарии, чем печатать ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.