Найти все файлы и каталоги с группой, отличной от владельца

375
Jistanidiot

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

Так что, если бы это были два файла в каталоге, я бы хотел найти первый:

$> ls -l -rw-rw-r--. 1 user175 group192 866 Dec 12 2006 index.htm -rw-r--r--. 1 user175 user175 921 Dec 14 2006 index2.html 

Я играл с find, но начинаю думать, что мне придется сдаться и написать какой-то сценарий (я бы действительно не хотел писать сценарий).

Заранее спасибо.

0
В Linux есть ** тысячи ** каталогов. Вы уверены, что хотите сделать это для ** всех ** каталогов, существующих на вашем компьютере? Или для конкретных? Если последнее, то задача намного проще. Fanatique 6 лет назад 0

2 ответа на вопрос

1
Kamil Maciorowski
find . -exec sh -c ' stat -c "%U %G" "$1" | awk -F " " "\$1==\$2" ' sh {} \; -print 

Он работает statдля каждого объекта, извлекает его владельца и группу; awkзатем возвращает статус выхода, 0только если они отличаются. В действительности только они напечатаны.

Заметки:

  • Производительность низкая. Каждый объект нуждается в своем собственном sh, statи awk. У меня были некоторые идеи по улучшению этого ( find . -exec stat … {} + | awk …), но я не уверен, что смогу сделать их достаточно надежными для работы с возможными именами файлов с символами новой строки и т. Д. Я решил не рисковать. Вы можете использовать -print0при необходимости. Этот подход также позволяет добавить больше условий find.
  • В моем Kubuntu stat -c "%U %G"возвращается UNKNOWNUID (или GID), которые нельзя перевести на имена. Я думаю, что если будет пользователь UNKNOWNили группа UNKNOWN, это будет мешать. Возвращаемый объект UNKNOWN UNKNOWNнаивно интерпретируется как имеющий совпадающего владельца и группу.
Это может длиться вечно даже в каталоге с несколькими файлами, но, похоже, работает во всех случаях. Благодарю. Jistanidiot 6 лет назад 0
0
C0deDaedalus

Ну, я нашел другое решение, которое использует lsи awkвместо того, чтобы найти. И это, безусловно, необходимо и может быть оптимизировано. Здесь это идет:

ls -alR | awk '{ if ($3 != $4) print $0 }' 

Как это устроено :

  • Посмотрите, что -alRот человека LS
  • awk ищет шаблон.
  • $3И, $4соответственно, дает 3 - е & 4 - й столбец в выходной LS, которые являются file ownerи groupчто владельцем является частью.
  • $0 дает полную строку в выводе ls.
  • Условие if ($3 != $4) print $0интерпретируется как «Вывести полную строку со всеми столбцами, в которых значение в 3- м столбце не равно значению в 4- м столбце»
  • Полная команда может быть интерпретирована как Печать только тех строк в выводе ls, где имя владельца файла и имя группы не совпадают .

Ограничение:

Иногда, это дает эту ошибку для некоторых файлов:

ls: cannot open directory './chatscripts': Permission denied 

Насколько я понимаю, это проблема разрешения пользователя, от которого выполняется команда. Пользователь не является ни владельцем, ни частью группы для этого файла и поэтому не может получить к нему доступ.


То, что вы хотите, может быть определенно выполнено с помощью findкоманды, но я думаю, что это тоже может быть решением, и проблема с разрешениями останется, если вы сделаете это с помощью findкоманды.

Не стесняйтесь добавлять дополнительные детали.

Это работает, пока вы не нажмете одно из проблемных имен файлов / каталогов, как указано в разделе «почему вы не должны анализировать вывод ls». Jistanidiot 6 лет назад 0

Похожие вопросы