Как использовать команду find для вывода списка файлов, доступных для записи всем пользователям, в каталоге, не переходя ни в какие подкаталоги?

Как использовать команду find для вывода списка файлов, доступных для записи всем пользователям, в каталоге, не переходя ни в какие подкаталоги?

Решение этой проблемы ускользало от меня неделями. Я пытаюсь написать команду для поиска только файлов, доступных для записи всем пользователям, в определенном наборе каталогов без перехода в какие-либо подкаталоги с использованием -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.)

Связанный контент