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)
"%04o"不行?如果你检查libc手册的第二部分(man 2 stat从shell),你应该看到这样的东西:
状态信息字st_mode具有以下位:
Run Code Online (Sandbox Code Playgroud)#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 */
精确的内容不会完全相同,但八进制值在任何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)