Есть ли какая-либо опция ширины / глубины в утилите Linux 'find'?
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
Но я предпочитаю небольшие сценарии, чем печатать ...