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


192

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

Ответы:


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

4
Я дам вам голос за техническую сторону, но люди обычно говорят «никому не принадлежит», если имеют в виду то, что вы интерпретируете.
Шибуми

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

12

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


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

9

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

find <dir> ! -user <username> 

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

5

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

ls -laR *(^U)

или

ls -la **/*(^U)

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


Это правда, что приведенная выше команда не будет отображать точечные файлы даже с -aфлагом из-за подстановочного знака. Для того, чтобы поймать дот файлы используют ЗШ dotglobвариант: setopt dotglob. В одной строке: (setopt dotglob; ls **/*(^U) ). Скобки предназначены для запуска в подоболочке, чтобы вам не приходилось запускать setopt nodotglobпосле завершения.
Zorawar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.