Ищете файлы, НЕ принадлежащие кому-либо

192

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

mike628
источник

Ответы:

286

Утилита find (1) имеет основные цвета, которые можно инвертировать ("перевернуть") с помощью символа "!" оператор. Однако в подсказке необходимо избежать отрицания с помощью обратной косой черты, поскольку это метасимвол оболочки. Результат:

find . \! -user foo -print
Мел
источник
8
побег !кажется необязательным
duplic1ejack
1
xargs -I{} -P3 -- ${cmdhere} {}передача вывода по конвейеру позволяет $ {cmdhere} работать с каждым файлом параллельно. cmdhere :: = стандартные утилиты unix; стандартные unix utils :: = chmod, chown, stat, ls, ...
Дуайт Спенсер,
1
@sorin ты имеешь в виду find . ...или трубопровод к xargsпервому или второму пути?
Кев
4
find имеет флаг -exec -> find . ! -user foo -exec chown <owner>:<group> {} \;
pastephens
1
как добавить информацию о владельце в качестве вывода?
Duc Tran
41

Ищете файлы, НЕ принадлежащие кому-либо

Другие ответили на вопрос «НЕ принадлежит конкретному пользователю» в теле. Вот тот, который отвечает на главный вопрос, но не был предоставлен:

$ find / -nouser

Вы можете использовать это так:

$ sudo find /var/www -nouser -exec chown root:apache {} \;

И еще один родственный:

$ find / -nogroup
jww
источник
4
Я дам вам голос за техническую сторону, но люди обычно говорят «никому не принадлежит», если имеют в виду то, что вы интерпретируете.
Шибуми
2
@Shibumi - Да, звучит неплохо для этих секущихся волос. Проблема, с которой я столкнулся, заключалась в том, что мне нужно было найти файлы, буквально не принадлежащие ни одному пользователю. Он появился после обновления и миграции веб-сервера. Некоторые идентификаторы пользователей / групп изменились, поэтому мне нужно было написать сценарий chown.
jww 03
12

-userнаходит по пользователю или идентификатору пользователя и !инвертирует предикат. Так, ! -user ....

Игнасио Васкес-Абрамс
источник
2
Проголосовали против, потому что он ничего не добавляет к принятому ответу и маскирует другие возможные ответы (например, шаблон zsh glob ниже).
Ulysse BN
9

Вы можете использовать это:

find <dir> ! -user <username> 
Crayon Violent
источник
2
Проголосовали против, потому что он ничего не добавляет к принятому ответу и маскирует другие возможные ответы (например, шаблон zsh glob ниже).
Ulysse BN
5

Используя z-shell (zsh), вы можете использовать

ls -laR *(^U)

или

ls -la **/*(^U)

для поиска всех файлов, не принадлежащих вам рекурсивно.

AB
источник
Это правда, что приведенная выше команда не будет отображать точечные файлы даже с -aфлагом из-за подстановочного знака. Для того, чтобы поймать дот файлы используют ЗШ dotglobвариант: setopt dotglob. В одной строке: (setopt dotglob; ls **/*(^U) ). Скобки предназначены для запуска в подоболочке, чтобы вам не приходилось запускать setopt nodotglobпосле завершения.
Zorawar