如何使用Ruby获得八进制文件权限?

mbi*_*ras 0 ruby unix file-permissions

我读了另一个关于如何使用perl 获取八进制文件权限的答案:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用了File::Stat类和#printf方法.但是,我的所有输出都获得了领先的100.

$ ruby -e 'Dir["**/**"].each { |f| printf "%04o\t#{f}\n", File.stat(f).mode }'
100711  cplink
100644  hello_world.rb
100755  lso
100711  rename_images
Run Code Online (Sandbox Code Playgroud)
  • 鉴于我在macOS机器上的领先100意味着什么?
  • 为什么我"%04o"不行?
  • 如何实现与链接的perl脚本相同的输出?

mu *_*ort 9

如果你检查libc手册的第二部分(man 2 stat从shell),你应该看到这样的东西:

状态信息字st_mode具有以下位:

#define S_IFMT   0170000  /* type of file */
#define S_IFIFO  0010000  /* named pipe (fifo) */
#define S_IFCHR  0020000  /* character special */
#define S_IFDIR  0040000  /* directory */
#define S_IFBLK  0060000  /* block special */
#define S_IFREG  0100000  /* regular */
#define S_IFLNK  0120000  /* symbolic link */
#define S_IFSOCK 0140000  /* socket */
#define S_IFWHT  0160000  /* whiteout */
#define S_ISUID  0004000  /* set user id on execution */
#define S_ISGID  0002000  /* set group id on execution */
#define S_ISVTX  0001000  /* save swapped text even after use */
#define S_IRUSR  0000400  /* read permission, owner */
#define S_IWUSR  0000200  /* write permission, owner */
#define S_IXUSR  0000100  /* execute/search permission, owner */
Run Code Online (Sandbox Code Playgroud)

精确的内容不会完全相同,但八进制值在任何Unixy系统上应该是相同的.

您感兴趣的部分是"这是一个常规文件"位:

#define S_IFREG  0100000  /* regular */
Run Code Online (Sandbox Code Playgroud)

这就是你的领导100来自哪里.

如果你回顾一下Perl版本,你会看到他们正在应用一个掩码:

(stat)[2] & 07777
          ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

只抓住权限位.如果你在Ruby中做同样的事情:

printf "%04o\t#{f}\n", (File.stat(f).mode & 07777)
# ----------------------------------------^^^^^^^
Run Code Online (Sandbox Code Playgroud)

你会得到你期望的那种输出.


如果您没有libc手册页,那么您可以查看OpenGroup的stat文档,该struct stat文档将为您指出涵盖模式中各个位的文档:

???????????????????????????????????????????????????????????????????
? Name    ?  Numeric  ?               Description                 ?            
?         ?   Value   ?                                           ?            
???????????????????????????????????????????????????????????????????
? S_IRWXU ? 0700      ? Read, write, execute/search by owner.     ? 
???????????????????????????????????????????????????????????????????
? S_IRUSR ? 0400      ? Read permission, owner.                   ?            
???????????????????????????????????????????????????????????????????
? S_IWUSR ? 0200      ? Write permission, owner.                  ?            
???????????????????????????????????????????????????????????????????
? S_IXUSR ? 0100      ? Execute/search permission, owner.         ?
???????????????????????????????????????????????????????????????????
? S_IRWXG ? 070       ? Read, write, execute/search by group.     ? 
???????????????????????????????????????????????????????????????????
? S_IRGRP ? 040       ? Read permission, group.                   ?            
???????????????????????????????????????????????????????????????????
? S_IWGRP ? 020       ? Write permission, group.                  ?            
???????????????????????????????????????????????????????????????????
? S_IXGRP ? 010       ? Execute/search permission, group.         ?
???????????????????????????????????????????????????????????????????
? S_IRWXO ? 07        ? Read, write, execute/search by others.    ? 
???????????????????????????????????????????????????????????????????
? S_IROTH ? 04        ? Read permission, others.                  ?            
???????????????????????????????????????????????????????????????????
? S_IWOTH ? 02        ? Write permission, others.                 ?            
???????????????????????????????????????????????????????????????????
? S_IXOTH ? 01        ? Execute/search permission, others.        ?
???????????????????????????????????????????????????????????????????
? S_ISUID ? 04000     ? Set-user-ID on execution.                 ?            
???????????????????????????????????????????????????????????????????
? S_ISGID ? 02000     ? Set-group-ID on execution.                ?
???????????????????????????????????????????????????????????????????
? S_ISVTX ? 01000     ? On directories, restricted deletion flag. ?
???????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)