12

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

3 ответа3

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 (//) и т.д.
2

Нету

Перейти к этому вопросу на SO для обходных путей.

1

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .