Procurando arquivos que NÃO pertencem a alguém

182

Eu estou olhando recursivamente através de diretórios para encontrar arquivos que não pertencem a um usuário específico e não tenho certeza de como escrever isso.

mike628
fonte

Respostas:

274

O utilitário find (1) possui primárias que podem ser negadas ("revertidas") usando o "!" operador. No prompt, é necessário, no entanto, escapar da negação com uma barra invertida, pois é um metacaractere de concha. Resultado:

find . \! -user foo -print
Mel
fonte
6
escapar da !parece ser opcional
doub1ejack
1
canalizar a saída para xargs -I{} -P3 -- ${cmdhere} {}que $ {cmdhere} opere em cada arquivo em paralelo. cmdhere :: = utilitários unix padrão; utils Unix Padrão :: = chmod, chown, stat, ls, ...
Dwight Spencer
1
@sorin você quer dizer a find . ...tubulação ou xargsa primeira ou a segunda maneira?
Kev
3
find tem a bandeira -exec -> find . ! -user foo -exec chown <owner>:<group> {} \;
pastephens
1
como adicionar informações do proprietário como saída?
Duc Tran
38

Procurando arquivos que NÃO pertencem a alguém

Outros responderam à pergunta "NÃO pertencente a um usuário específico" no corpo. Aqui está um que responde à pergunta do titular, mas não foi fornecido:

$ find / -nouser

Você pode usá-lo assim:

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

E um relacionado:

$ find / -nogroup
jww
fonte
3
Dou-lhe um voto pelo tecnicismo, mas as pessoas geralmente dizem "não pertencem a ninguém" se elas significam o que você está interpretando.
Shibumi
2
@Shibumi - Sim, parece certo para aqueles cabelos que partem. O problema que enfrentei foi que eu precisava encontrar arquivos literalmente não pertencentes a nenhum usuário. Surgiu após uma atualização e migração do servidor web. Alguns IDs de usuário / grupo foram alterados, então eu precisava criar um script para um chown.
JWW
12

-userlocaliza por usuário ou ID do usuário e !inverte o predicado. Então ! -user ...,.

Ignacio Vazquez-Abrams
fonte
2
Voto negativo porque não adiciona nada à resposta aceita e mascara outras respostas possíveis (como o padrão zsh glob abaixo).
Ulysse BN
9

Você pode usar isto:

find <dir> ! -user <username> 
Crayon Violent
fonte
2
Voto negativo porque não adiciona nada à resposta aceita e mascara outras respostas possíveis (como o padrão zsh glob abaixo).
Ulysse BN
5

Usando o z-shell (zsh), você pode usar

ls -laR *(^U)

ou

ls -la **/*(^U)

para procurar todos os arquivos recursivamente não pertencentes a você.

AB
fonte
É verdade que o comando acima não listará arquivos de ponto, mesmo com o -asinalizador devido à expansão do curinga. Para pegar dot arquivos usam o zsh dotglobopção: setopt dotglob. Em uma linha: (setopt dotglob; ls **/*(^U) ). Os parênteses devem ser executados em um subshell, para que você não precise executar setopt nodotglobdepois de terminar.
Zorawar