ls 命令及其许多参数提供了一些非常有用的文件信息。另一个不太为人所熟知的命令 stat 提供了一些更为有用的信息。
1 [root@Gin scripts]# man stat 2 STAT(1) User Commands STAT(1) 3 4 NAME 5 stat - display file or file system status 6 7 SYNOPSIS 8 stat [OPTION]... FILE... 9 10 DESCRIPTION 11 Display file or file system status. 12 13 -L, --dereference 14 follow links 15 16 : 17 STAT(1) User Commands STAT(1) 18 19 NAME 20 stat - display file or file system status 21 22 SYNOPSIS 23 stat [OPTION]... FILE... 24 25 DESCRIPTION 26 Display file or file system status. 27 28 -L, --dereference 29 follow links 30 31 -Z, --context 32 print the SELinux security context 33 34 -f, --file-system 35 display file system status instead of file status 36 37 -c --format=FORMAT 38 use the specified FORMAT instead of the default; output a newline 39 after each use of FORMAT 40 41 --printf=FORMAT 42 like --format, but interpret backslash escapes, and do not output a 43 mandatory trailing newline. If you want a newline, include in 44 FORMAT. 45 46 -t, --terse 47 print the information in terse form 48 49 --help display this help and exit 50 51 --version 52 output version information and exit 53 54 The valid format sequences for files (without --file-system): 55 56 %a Access rights in octal 57 58 %A Access rights in human readable form 59 60 %b Number of blocks allocated (see %B) 61 62 %B The size in bytes of each block reported by %b 63 64 %C SELinux security context string 65 66 %d Device number in decimal 67 68 %D Device number in hex 69 70 %f Raw mode in hex 71 72 %F File type 73 74 %g Group ID of owner 75 76 %G Group name of owner 77 78 %h Number of hard links 79 80 %i Inode number 81 82 %n File name 83 84 %N Quoted file name with dereference if symbolic link 85 86 %o I/O block size 87 88 %s Total size, in bytes 89 90 %t Major device type in hex 91 92 %T Minor device type in hex 93 94 %u User ID of owner 95 96 %U User name of owner 97 98 %x Time of last access 99 100 %X Time of last access as seconds since Epoch 101 102 %y Time of last modification 103 104 %Y Time of last modification as seconds since Epoch 105 106 %z Time of last change 107 108 %Z Time of last change as seconds since Epoch 109 110 Valid format sequences for file systems: 111 112 %a Free blocks available to non-superuser 113 114 %b Total data blocks in file system 115 116 %c Total file nodes in file system 117 118 %d Free file nodes in file system 119 120 %f Free blocks in file system 121 122 %C SELinux security context string 123 124 %i File System ID in hex 125 126 %l Maximum length of filenames 127 128 %n File name 129 130 %s Block size (for faster transfers) 131 132 %S Fundamental block size (for block counts) 133 134 %t Type in hex 135 136 %T Type in human readable form 137 138 NOTE: your shell may have its own version of stat, which usually super- 139 sedes the version described here. Please refer to your shell’s documenta- 140 tion for details about the options it supports. 141 142 AUTHOR 143 Written by Michael Meskes. 144 145 REPORTING BUGS 146 Report stat bugs to bug-coreutils@gnu.org 147 GNU coreutils home page: <http://www.gnu.org/software/coreutils/> 148 General help using GNU software: <http://www.gnu.org/gethelp/> 149 Report stat translation bugs to <http://translationproject.org/team/> 150 151 COPYRIGHT 152 Copyright © 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL 153 version 3 or later <http://gnu.org/licenses/gpl.html>. 154 This is free software: you are free to change and redistribute it. There 155 is NO WARRANTY, to the extent permitted by law. 156 157 SEE ALSO 158 stat(2) 159 160 The full documentation for stat is maintained as a Texinfo manual. If the 161 info and stat programs are properly installed at your site, the command 162 163 info coreutils 'stat invocation' 164 165 should give you access to the complete manual. 166 167 GNU coreutils 8.4 October 2014 STAT(1)
下面演示了stat 不带参数显示的信息:
[root@Gin scripts]# stat date.txt File: `date.txt' Size: 40 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 261790 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-01-29 10:49:25.119790781 +0800 Modify: 2017-01-29 10:49:11.961790098 +0800 Change: 2017-01-29 10:49:11.961790098 +0800
注意使用该命令获得的信息:除了通常的文件大小(也可以使用 ls -l 命令获得)以外,您还获得了该文件占用的块数。通常的 Linux 块大小为 512 字节,因此一个大小为 93,300,148 字节的文件将占用 (93300148/512=) 182226.85 个块。由于块都是完整占用,因此该文件使用了一些整数个数的块。无需猜测就可以获得确切的块数。
您还可以从以上输出中获得文件所有权的 GID 和 UID,以及权限的八进制表示形式 (6751)。如果要将文件恢复到它现在具有的相同权限,可以使用 chmod 6751 oracle,而不是显式拼写这些权限。
以上输出最有用的部分是文件访问时间戳信息。该输出显示,该文件被访问的时间是 2006-08-04 04:30:52(显示在“Access:”的旁边),即 2006 年 8 月 4 日上午 4:30:52。这是某个人开始使用数据库的时间。该文件的修改时间是 2005-11-02 11:49:47(显示在“Modify:”的旁边)。最后,“Change:”旁边的时间戳显示文件状态更改的时间。
stat 命令的修改符 -f 显示了有关文件系统(而非文件)的信息:
[root@Gin scripts]# stat -f date.txt File: "date.txt" ID: ff0d2532e41897c0 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 1851748 Free: 1286127 Available: 1190396 Inodes: Total: 479552 Free: 409340
另一个选项 -t 显示了完全相同的信息,只不过是在一行中显示的:
[root@Gin scripts]# stat -t date.txt date.txt 40 8 81a4 0 0 803 261790 1 0 0 1485658165 1485658151 1485658151 4096
这对 shell 脚本非常有用,在 shell 脚本中可以使用一个简单的 cut 命令获得值以进行进一步处理。
应用案例:
如何取得stat /poe命令后文件的权限对应的数字内容,如-rw-r--r--为644,要求使用命令取得644或0644这样的数字。
[root@Gin scripts]# stat date.txt File: `date.txt' Size: 40 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 261790 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-01-29 10:49:25.119790781 +0800 Modify: 2017-01-29 10:49:11.961790098 +0800 Change: 2017-01-29 10:49:11.961790098 +0800 [root@Gin scripts]# stat -c %a date.txt 644