Localizando arquivos e exibindo seu dono

4

Eu tenho que procurar um tipo de arquivo específico em uma unidade de armazenamento e também quero conhecer seus proprietários.

Com locate '*.txt' >> result.txt , localizei todos os arquivos que estou procurando, mas estou sentindo falta do proprietário dessa maneira.

Alguma sugestão de como eu poderia fazer isso corretamente?

    
por Dan 08.01.2014 / 15:02

4 respostas

5
locate -0 '*.txt' | xargs -r0 stat -c "%n %U" >>result.txt

deve fazer o truque

    
por 08.01.2014 / 15:11
4

o locate funcionará enquanto o diretório estiver indexado. Caso contrário, use find

find /directory/to/search -name "*.txt" -exec ls -ld {} + >> result.txt
    
por 08.01.2014 / 15:55
3

Se você quiser que ele lide com nomes de arquivos com novas linhas e caracteres especiais, você deverá exibir o nome do usuário primeiro (já que não pode conter caracteres especiais) e uma lista separada por NUL:

locate -0 .txt | xargs -r0 stat --printf "%U %n
while IFS=: read -r -d '' -u 9 user path
do
    whatever_you_want -- "$path"
done 9< <( locate -0 .txt | xargs -r0 stat --printf "%U:%n
locate -0 .txt | xargs -r0 stat --printf "%U %n
while IFS=: read -r -d '' -u 9 user path
do
    whatever_you_want -- "$path"
done 9< <( locate -0 .txt | xargs -r0 stat --printf "%U:%n%pre%" )
"
" )
"

Você pode processar os arquivos com confiança :

%pre%

A vantagem em relação à resposta do @ DougONeal é que é fácil analisar o resultado, pois o nome de usuário simples é o primeiro na string, e como os caminhos com novas linhas são tratados corretamente.

    
por 08.01.2014 / 15:10
2

Se você realmente deseja apenas arquivos que terminem com o sufixo .txt , a resposta aceita não fará isso. Ele retornará resultados como este, por exemplo:

$ locate -0 .txt | xargs -r0 stat -c "%n %U" | grep -Ev '.txt '
...
/home/saml/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.4/lib/phusion_passenger/templates/apache2/run_installer_as_root.txt.erb saml
/home/saml/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.4/lib/phusion_passenger/templates/apache2/welcome.txt.erb saml
/home/saml/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.4/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb saml
/home/saml/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.4/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb saml
/usr/share/vim/vim74/doc/usr_42.txt.gz root
...

Em vez disso, você pode dizer a locate para usar um regex da seguinte forma:

$ locate -0 --regex '\.txt$' | xargs -r0 stat -c "%n %U"
    
por 08.01.2014 / 16:23