
Решение этой проблемы ускользало от меня неделями. Я пытаюсь написать команду для поиска только файлов, доступных для записи всем пользователям, в определенном наборе каталогов без перехода в какие-либо подкаталоги с использованием -prune
.
Я перепробовал множество разных вариантов, но остановился только на одном
find / -type f -perm -2
Однако это все еще переходит в подкаталоги. Используя команду
find / -prune -type f -perm -2
тоже не дает результатов. Где я ошибаюсь?
решение1
Попробуйте maxdepth N
вместо этого использовать:
-уровни максимальной глубины
Спуститься на большинство уровней (неотрицательное целое число) уровней каталогов ниже начальных точек. -maxdepth 0 означает применять тесты и действия только к самим начальным точкам.
find $FOLDER -maxdepth 1 -perm -2
решение2
find / -type f -perm -2
Это рекурсивно. Вот что find
делает.
find / -prune -type f -perm -2
Здесь вы указываете find
применить -prune
ко всему, что он найдет. Условия и действия обрабатываются слева направо; поскольку до этого нет условия -prune
, оно применяется безусловно. Поэтому первое, что find
находит, а именно аргумент командной строки /
, -prune
применяется к нему и поэтому find
не проходит по содержимому каталога. Поскольку /
не соответствует следующим условиям, оно не выводится.
Чтобы обработать только записи каталога верхнего уровня, необходимо применить -prune
к каталогамза исключением аргументов командной строки. Переносимый способ сделать это — использовать /.
в конце пути, переданного в командной строке. Это заставляет find
обрабатывать их имя как .
, поэтому вы можете использовать -name .
для сопоставления с ними. При рекурсивном обходе ни один файл никогда не вызывается, .
поскольку это имя зарезервировано. Теперь есть три разных случая:
- Каталог верхнего уровня: recurse.
- Другой каталог: не рекурсивно.
- Обычный файл, доступный для записи всем: print.
Чтобы указать несколько различных поведений, используйте -o
оператор («или»). Применяется первый, для которого все условия совпадают.
find /. -name . -o -type d -prune -o -type f -perm -2 -print
Некоторые версии find
позволяют писать find / -name / -o -type d -prune -o …
, а некоторые — нет (например, BusyBox).
Некоторые версии find
поддерживают опции -mindepth
и -maxdepth
ограничивают рекурсивный обход. Если ваш find поддерживает это, вы можете использовать это вместо -prune
.
find / -mindepth 1 -maxdepth 1 -type f -perm -2
( -mindepth
и -maxdepth
являются глобальными опциями, часть условий и действий имеет -type f -perm -2
неявное завершение -print
.)