1

Можно ли сделать что-то вроде find -perm g=u? Я говорю "как" , потому что -perm mode режим требует , чтобы указать все биты, а не только g и потому , что я не могу поставить u на правой стороне = как я могу с помощью команды chmod

you can specify exactly one of the letters ugo: the permissions granted
to  the  user  who  owns the file (u), the permissions granted to other
users who are members of the file's  group  (g),  and  the  permissions
granted  to  users  that are in neither of the two preceding categories
(o).

На данный момент я делаю find | xargs -d \\n ls -lartd | egrep '^.(...)\1 что просто ужасно.

Благодарю.

2 ответа2

2

Это намного лучше (производит вывод с разделителями новой строки):

find . -type f -printf '%04m%p\n' | perl -ne 'print substr($_, 4) if /^.(.)\1/'

Или это, если любое из ваших имен файлов может содержать символы новой строки (создает вывод с нулевым байтом):

find . -type f -printf '%04m%p\0' | perl -n0e 'print substr($_, 4) if /^.(.)\1/'

По сути, команда find производит вывод примерно так:

0644./.config/banshee-1/banshee.db
0664./.config/gedit/gedit-print-settings
0664./.config/gedit/gedit-page-setup
0644./.config/gedit/accels

Команда perl затем фильтрует этот вывод и удаляет режим файла перед выводом любой подходящей строки:

./.config/gedit/gedit-print-settings
./.config/gedit/gedit-page-setup

Если вы хотите включить каталоги, FIFO, сокеты и узлы устройства, а не только файлы, опустите -type f . Тогда все символические ссылки появятся в списке (так как они всегда имеют режим 0777), поэтому вы можете либо исключить их, нажав ! -type l или следуйте за ними с -L .

1

Попробуйте это: (пришлось редактировать, пренебрегали обработкой имен файлов с пробелами)

find . -type d -or -type f -ls | \
 awk '{ perm=$3; fname=11; if (substr(perm,1,3) == substr(perm,4,3)) { printf "%s",perm; while (fname<=NF) printf " %s",$(fname++); printf "\n"; } }'

Строка разделена на трубу для удобства чтения, но функционально - всего одна строка

Использование find позволяет показывать только файлы и каталоги, за исключением символических ссылок (всегда с перманентами lrwxrwxrwx), сокетов и других ненужных объектов.

Скрипт awk анализирует выходные данные find 'ls', сравнивает подстроки, соответствующие разрешениям пользователя и группы, если они равны, печатает разрешения и имя файла.

Конечно, вы можете удалить часть «perm» оператора print, чтобы выводились только имена файлов, после того, как вы проверили это на свое усмотрение.

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