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

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

$> 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 ответа2

1
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 .
  • В моем Kubuntu stat -c "%U %G" возвращает UNKNOWN для UID (или GID), которые нельзя преобразовать в имена. Я думаю, что если будет пользователь UNKNOWN или группа UNKNOWN , это помешает. Объект, возвращающий UNKNOWN UNKNOWN , наивно интерпретируется как имеющий соответствующего владельца и группу.
0

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

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

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

  • Посмотрите, что -alR делает от man 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 .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .