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