Forum: Ruby Find out the name of a user, on a given file/dir/symlink?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Robert H. (Guest)
on 2009-06-09 18:43
Right now I use this:

require 'fileutils'
require 'etc'
require 'pp'

FileUtils.touch 'test'

name = Etc.getpwuid(File.stat('test').uid).name

puts name


This gives me the name of the file/dir/symlink in question, i.e
who owns it.

However, I found this is a bit long. Anyone knows of a shorter
way? Specifically I wonder if I have to use both Etc. and File.
or if I can just one one of these two.

I didn't find a quick way to just retrieve the name in class File
though.
Robert K. (Guest)
on 2009-06-09 19:47
(Received via mailing list)
2009/6/9 Marc H. <removed_email_address@domain.invalid>:
> puts name
>
>
> This gives me the name of the file/dir/symlink in question, i.e
> who owns it.
>
> However, I found this is a bit long. Anyone knows of a shorter
> way? Specifically I wonder if I have to use both Etc. and File.
> or if I can just one one of these two.

As far as I can see you need both because File.stat only returns the
numeric ID.

irb(main):008:0> st = File.stat "."
=> #<File::Stat dev=0x50a951b9, ino=6755399441101867, mode=040755,
nlink=9, uid=14366, gid=10513, rdev=0x50a951b9, size=0, blksize=65536,
blocks=0, atime=2009-06-09 17:44:07 +0100, mtime=2009-06-09 17:35:03
+0100, ctime=2009-06-09 17:35:03 +0100>
irb(main):009:0> st.owned?
=> true
irb(main):010:0> st.uid
=> 14366
irb(main):011:0>

Kind regards

robert
Daniel B. (Guest)
on 2009-06-09 19:48
(Received via mailing list)
> require 'pp'
>
> However, I found this is a bit long. Anyone knows of a shorter
> way? Specifically I wonder if I have to use both Etc. and File.
> or if I can just one one of these two.
>
> I didn't find a quick way to just retrieve the name in class File
> though.

That's about as good as it gets. You can always re-open the File class
if this is something you need on a regular basis:

class File
   def self.owner(file)
      Etc.getpwuid(stat(file).uid).name
   end
end

Regards,

Dan
Robert H. (Guest)
on 2009-06-09 19:57
> That's about as good as it gets. You can always re-open the File class
> if this is something you need on a regular basis:

Thanks to both, I guess I will extend File for the project.

Cheers.
Robert K. (Guest)
on 2009-06-10 15:45
(Received via mailing list)
2009/6/9 Marc H. <removed_email_address@domain.invalid>:
>> That's about as good as it gets. You can always re-open the File class
>> if this is something you need on a regular basis:
>
> Thanks to both, I guess I will extend File for the project.

I do not know how fast Etc.getpwuid is but I assume it might be slow
because the information has to be retrieved via system calls and
potentially grabbed from persistent storage. If you need this
frequently then you might want to cache entries, e.g.

USER_NAME = Hash.new {|h,uid| h[uid] = uid ? Etc.getpwuid(uid).name :
"<unknown>"}

files.each do |f|
  puts f, USER_NAME[File.stat(f).uid]
end

Kind regards

robert
This topic is locked and can not be replied to.