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

M

Marc Heiler

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.
 
R

Robert Klemme

2009/6/9 Marc Heiler said:
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.

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
 
D

Daniel Berger

-----Original Message-----
From: (e-mail address removed) [mailto:[email protected]]
Sent: Tuesday, June 09, 2009 8:43 AM
To: ruby-talk ML
Subject: Find out the name of a user, on a given file/dir/symlink?
=20
Right now I use this:
=20
require 'fileutils'
require 'etc'
require 'pp'
=20
FileUtils.touch 'test'
=20
name =3D Etc.getpwuid(File.stat('test').uid).name
=20
puts name
=20
=20
This gives me the name of the file/dir/symlink in question, i.e
who owns it.
=20
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.
=20
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
 
M

Marc Heiler

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.
 
R

Robert Klemme

2009/6/9 Marc Heiler said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top