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

Discussion in 'Ruby' started by Marc Heiler, Jun 9, 2009.

  1. Marc Heiler

    Marc Heiler Guest

    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.
    --
    Posted via http://www.ruby-forum.com/.
     
    Marc Heiler, Jun 9, 2009
    #1
    1. Advertising

  2. 2009/6/9 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.


    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


    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
     
    Robert Klemme, Jun 9, 2009
    #2
    1. Advertising


  3. > -----Original Message-----
    > From: [mailto:]
    > 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
     
    Daniel Berger, Jun 9, 2009
    #3
  4. Marc Heiler

    Marc Heiler Guest

    > 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.
    --
    Posted via http://www.ruby-forum.com/.
     
    Marc Heiler, Jun 9, 2009
    #4
  5. 2009/6/9 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.


    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

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
     
    Robert Klemme, Jun 10, 2009
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    4
    Views:
    795
    Daniel Dittmar
    Dec 16, 2004
  2. Merrigan
    Replies:
    6
    Views:
    302
    Merrigan
    May 1, 2006
  3. Kga Agk
    Replies:
    2
    Views:
    160
    Kga Agk
    Jun 29, 2009
  4. kj
    Replies:
    10
    Views:
    264
    Joe Smith
    May 26, 2004
  5. vurt
    Replies:
    1
    Views:
    105
    Ben Morrow
    May 24, 2004
Loading...

Share This Page