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

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

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

$> 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, но начинаю думать, что мне придется сдаться и написать какой-то сценарий (я бы действительно не писал сценарий).

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

2 ответа

Решение
find . -exec sh -c '
      stat -c "%U %G" "$1" |
      awk -F " " "\$1==\$2{exit 1}"
   ' sh {} \; -print

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

Заметки:

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

Ну, я нашел другое решение, которое использует 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 команда.

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

Другие вопросы по тегам