Команда find: как найти все такие файлы с маской?

Вопрос или проблема

Я пытаюсь отфильтровать файлы, используя find, однако испытываю трудности. Кто-нибудь знает правильную команду для фильтрации “Untitled.rtf” с использованием разрешений файлов? Похоже на BSD?

-rwxr-xr-x@ 1 X  staff  368 Jan 24 03:02 Untitled.rtf*
-rw-------  1 X  staff    0 Jan 24 02:37 t
-r--------  1 X  staff    0 Jan 24 02:40 t2
drwx------  2 X  staff   64 Jan 24 02:52 t3/

Я могу найти файл, который хочу отфильтровать:

$ find . \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) -exec ls -l {} \;

-rwxr-xr-x@ 1 X  staff  368 Jan 24 03:02 ./Untitled.rtf

Теперь я пробую эту команду find, используя ! (НЕ) и -a (И), однако она не работает, как задумано, чтобы удалить Untitled.rtf из результирующего списка:

$ find . \( -perm -000 -a ! \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) \) -exec ls -l {} \;

-rwxr-xr-x@ 1 X  staff  368 Jan 24 03:02 Untitled.rtf
-rw-------  1 X  staff    0 Jan 24 02:37 t
-r--------  1 X  staff    0 Jan 24 02:40 t2
drwx------  2 X  staff   64 Jan 24 02:52 t3
-r--------  1 X  staff  0 Jan 24 02:40 ./t2
-rw-------  1 X  staff  0 Jan 24 02:37 ./t

Я предполагаю, что ваш критерий для исключения файла/каталога заключается в том, что у него установлены любые биты разрешений для группы или других. Вы можете использовать любой из этих конструктов, чтобы избежать совпадения с такими файлами:

find <path> ! ( <permissions_mask_set> ) -exec ls -ld {} ;

find <path> ( <permissions_mask_set> ) -o -exec ls -ld {} ;

Берем первый из них, так как он соответствует вашему собственному примеру, он станет:

find . \! \( -perm -001 -o -perm -002 -o -perm -004 -o -perm -010 -o -perm -020 -o -perm -040 \) -exec ls -ld {} \;

Для систем с GNU find маска разрешений может быть значительно упрощена:

find . \! -perm /077 -exec ls -ld {} \;

Причина, по которой ваша собственная попытка показывает все, включая исключенные вами файлы, заключается в том, что одно из значений, переданное в -exec, это команда, которая выглядит (частично) так

ls -l .

Если вы выполните это в командной строке, вы получите список всех файлов/каталогов в текущем каталоге – включая те, которые вы хотите исключить. Ключ либо использовать флаг -d, чтобы избежать отображения содержимого каталога, либо квалифицировать команду find, либо искать только файлы, либо исключать каталоги.

На Solaris (которая, кстати, больше не основана на BSD), вы должны иметь возможность использовать GNU find, где -perm принимает /bitset, который оценивается как истинный, если любой из битов разрешений файла находится в наборе битов.

/usr/gnu/bin/find . ! -perm /77 -ls

Или

/usr/gnu/bin/find . ! -perm /go=rwx -ls

Вернет файлы, где ни один из битов ---rwxrwx не установлен.

Или вы можете использовать zsh, который должен быть установлен по умолчанию на Solaris, пока вы не используете её упрощенную версию:

ls -ld -- **/*(Df00)

Или:

ls -ld -- **/*(Df-77)

Или:

ls -ld -- **/*(Df[go=])

Или:

ls -ld -- **/*(D^AIERWX)

Из другой оболочки:

zsh -c 'ls -ld -- **/*(Df[go=])'

Например.

.

Ответ или решение

Вопрос о том, как использовать команду find для фильтрации файлов на основе их атрибутов, таких как права доступа, вызывает у многих пользователей командной строки Unix систем определенные сложности. В данном случае речь идет о необходимости исключения конкретного файла с именем "Untitled.rtf" на системах, похожих на BSD. Для правильного решения этой задачи требуется глубокое понимание работы с файловыми правами и конструкции команды find.

Теория:

Команда find в Unix системах используется для поиска файлов и директорий на основе определенных критериев, таких как имя, размер, права доступа, и других атрибутов. В частности, флаг -perm позволяет фильтровать файлы по их правам доступа. Права доступа представляют собой комбинацию битов, определяющую, какие действия могут совершать владелец (user), группа (group), и остальные пользователи (others) с файлом. В Unix правах доступа используются три категории прав для каждой из этих групп: чтение (r), запись (w), и выполнение (x).

Для более сложных запросов могут использоваться логические операторы такие как -o (ИЛИ) и -a (И), а также отрицание с помощью ! (НЕ). Правильное использование этих операторов позволяет строить сложные логические конструкции для фильтрации файлов.

Пример:

Рассмотрим пример задачи: необходимо исключить файл "Untitled.rtf" из результата команды find, основываясь на его правах доступа. Файл "Untitled.rtf" имеет права -rwxr-xr-x, что означает, что владелец может читать, писать и выполнять файл, группа может читать и выполнять, а остальные пользователи также могут читать и выполнять.

Попробуем найти все файлы, у которых установлены какие-либо права доступа для группы или остальных пользователей. Одним из методов является использование команды find с отрицанием тех условий, которые соответствуют файлу "Untitled.rtf".

Первоначальное выражение для поиска файлов с правами для группы или остальных пользователей:

find . \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) -exec ls -l {} \;

Теперь модифицируем его, чтобы исключить такие файлы:

find . \! \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) -exec ls -ld {} \;

Этот разбор показывает использование логического отрицания \! перед группой условий в скобках, что означает выбор файлов, которые НЕ соответствуют ни одному из перечисленных условий.

Применение:

Для практического использования этой команды на BSD-подобных системах, пользователю необходимо настроить параметры команды find таким образом, чтобы правильно учитывать все соответствующие файлы и исключать те, которые не соответствуют условиям. Это особенно важно, когда требуются точные поисковые запросы без лишнего "шума" от нежелательных файлов.

На системах с GNU утилитами можно значительно упростить задачу использования команды find благодаря наличию улучшенной логики в параметре -perm. Например:

find . \! -perm /077 -exec ls -ld {} \;

Эта команда исключает все файлы с установленными правами для группы и остальных пользователей.

Для систем Solaris, которые поддерживают GNU утилиты, можно использовать такие команды:

/usr/gnu/bin/find . ! -perm /go=rwx -ls

Эти команды обеспечивают мощное средство для управления и фильтрации файлов на основе их прав доступа, что особенно важно для системных администраторов и разработчиков, работающих в корпоративной среде.

Таким образом, помещение правильных условиях в команду find, понимание файловых прав и использование логических операторов являются ключевыми навыками при управлении файлами в Unix-системах. Надлежащий подход позволяет оптимизировать рабочие процессы, ускорить выполнение задач и повысить продуктивность в IT-среде.

Оцените материал
Добавить комментарий

Капча загружается...