Вопрос или проблема
Я пытаюсь отфильтровать файлы, используя 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-среде.