Использование find в Linux для поиска файлов с соответствующими группами / другими разрешениями

2

Мне нужно найти все файлы в каталоге, где совпадают группы и другие разрешения (например, те, в которых членство группы в файле фактически не влияет на доступ).

Поскольку существует только 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. Добавление их сделает команду еще длиннее ... надеюсь, есть лучший способ!

Майк Майерс
источник
Не знаю ответа, но если бы я пытался это сделать, я бы начал с поиска, который исключает только то, что вы никогда не хотите видеть, и затем направил вывод в другие фильтры, такие как grep, sed или awk, где это намного проще (особенно с awk), чтобы решить проблему по одной части и добавить такие вещи, как операторы print, чтобы убедиться, что каждая часть делает то, что вы хотите. Разъяснение? Разрешения совпадают с чем? Какую «макро» проблему вы пытаетесь решить?
Джо
Проблема с передачей вывода другим командам в основном связана со «специальными» символами (особенно пробелами). Проблема «макроса» заключается в том, что мы хотели бы изменить идентификатор группы (числовой под символическим) в группе файлов (длинная история), но это медленно. Мы поняли, что можем изменить его на кучу файлов, где это на самом деле не имеет значения, пока запущены приложения, и сосредоточить наше время простоя на меньшем числе, где на самом деле имеют значение разрешения группы.
Майк Майерс

Ответы:

0

Ну, я все еще не уверен, что понимаю проблему (вероятно, не ваша вина!), Но вот несколько идей:

1) Используйте -print0опцию find(и аналогичные опции в grep, xargsи т. Д.) Для работы со специальными символами в именах файлов.

2) Может потребоваться некоторый сценарий foo, чтобы собрать все это вместе, но команда stat вернет восьмеричную строку разрешения для файла. Затем все, что вам нужно сделать, это разбить его на три отдельных символа (например, 775 -> 7 7 5) (используя модификаторы параметров bash или обработку строк на выбранном вами языке / инструменте), и если второй или третий символ соответствует сначала один, затем у вас есть идентичные разрешения для владельца и группы или других.

Улучшение в том, что вы смотрите на все три разрешения одновременно, вместо того, чтобы перечислять все перестановки. Они либо один и тот же триплет, либо нет. Для обработки строк разрешений длиной более 3 символов потребуется немного больше времени (для таких вещей, как липкие биты и т. Д.), Но это все равно в основном равный или не равный тест для поиска рассматриваемых файлов.

У меня нет времени, чтобы выяснить детали, но я бы начал с того, что смогу написать сценарий, который бы:

1) Получите и разбейте разрешения, используя, statа затем проверьте, совпадают ли разрешения. Если есть, напечатайте имя файла (возможно, полный путь) и разрешения или флаги для того, что нужно изменить. Если нет, просто отмените это имя файла.

2) Либо перенаправьте вывод findв этот скрипт, либо получите доступ к нему с помощью find -execопции.

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

Джо
источник
Я отмечаю это как ответ, потому что я пришел к тому же выводу, что и Джо, - то, что я хочу, - это слишком много, чтобы просить «найти», чтобы сделать это в одиночку. Указатель на то, что другие команды манипулирования файлами поддерживают нулевые выходные данные для имен файлов, также был очень полезен. Спасибо всем, кто нашел время, чтобы посмотреть.
Майк Майерс