Мне нужно найти все файлы в каталоге, где совпадают группы и другие разрешения (например, те, в которых членство группы в файле фактически не влияет на доступ).
Поскольку существует только 8 возможностей для этого (x00, x11, x22 и т. Д.), Я подумал, что могу просто выполнить поиск по этим разрешениям, но не могу найти способ явно сопоставить некоторые биты разрешения, не сопоставив их все (например, . сопоставить все 000, 100, 200, 300 и т. д. для x00).
Я построил длинное выражение для поиска:
find . \( \
-perm 000 -o -perm 011 -o -perm 022 -o -perm 033 [...] \
-perm 100 -o -perm 111 -o -perm 122 -o -perm 133 [...] \
[...]
\) -ls
И это работает, но кажется очень не элегантным (это более 8 символов ... и это до того, как я поместил какие-либо предложения по выбору пути, которые понадобятся ...).
Есть ли способ лучше?
Изменить: мне только что пришло в голову, что это игнорирует разрешения SUID / SGID. Добавление их сделает команду еще длиннее ... надеюсь, есть лучший способ!
источник
Ответы:
Ну, я все еще не уверен, что понимаю проблему (вероятно, не ваша вина!), Но вот несколько идей:
1) Используйте
-print0
опциюfind
(и аналогичные опции вgrep
,xargs
и т. Д.) Для работы со специальными символами в именах файлов.2) Может потребоваться некоторый сценарий foo, чтобы собрать все это вместе, но команда stat вернет восьмеричную строку разрешения для файла. Затем все, что вам нужно сделать, это разбить его на три отдельных символа (например, 775 -> 7 7 5) (используя модификаторы параметров bash или обработку строк на выбранном вами языке / инструменте), и если второй или третий символ соответствует сначала один, затем у вас есть идентичные разрешения для владельца и группы или других.
Улучшение в том, что вы смотрите на все три разрешения одновременно, вместо того, чтобы перечислять все перестановки. Они либо один и тот же триплет, либо нет. Для обработки строк разрешений длиной более 3 символов потребуется немного больше времени (для таких вещей, как липкие биты и т. Д.), Но это все равно в основном равный или не равный тест для поиска рассматриваемых файлов.
У меня нет времени, чтобы выяснить детали, но я бы начал с того, что смогу написать сценарий, который бы:
1) Получите и разбейте разрешения, используя,
stat
а затем проверьте, совпадают ли разрешения. Если есть, напечатайте имя файла (возможно, полный путь) и разрешения или флаги для того, что нужно изменить. Если нет, просто отмените это имя файла.2) Либо перенаправьте вывод
find
в этот скрипт, либо получите доступ к нему с помощьюfind
-exec
опции.3) Затем у вас будет список только файлов, которые необходимо изменить, а также то, что нужно каждому, и это можно будет обработать с помощью простого сценария.
источник