[Linuxcommand-announce] [LinuxCommand.org: Tips, News And Rants] stat
Brought to you by:
bshotts
From: William S. <bs...@pa...> - 2010-04-15 20:39:17
|
I was going to write the next installment in my New Features In Bash Version 4.x series today, but in thinking about the examples I want to use, I thought I should talk about the stat command first. We're all familiar with ls. It's the first command that most people learn. Using ls you can get a lot of information about a file: bshotts@twin7:~$ ls -l .bashrc -rw-r--r-- 1 bshotts bshotts 3800 2010-03-25 13:18 .bashrc Very handy. But there is one problem with ls; it's output is not very script friendly. Commands like cut cannot easily separate the fields (though awk can, but we're not talking about that yet). Wouldn't it be great if there was a command that let you get file information in a more flexible way? Fortunately there is such a command. It's called stat. The name "stat" derives from the word status. The stat command shows the status of a file or file system. In it's basic form, it works like this: bshotts@twin7:~$ stat .bashrc File: `.bashrc' Size: 3800 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 524890 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ bshotts) Gid: ( 1000/ bshotts) Access: 2010-04-15 08:46:22.292601436 -0400 Modify: 2010-03-25 13:18:09.621972000 -0400 Change: 2010-03-27 08:41:31.024116233 -0400 As we can see, when given the name of a file (more than one may be specified), stat displays everything the system knows about the file short of examining its contents. We see the file name, its size including the number of blocks it's using and the size of the blocks used on the device. The attribute information includes the owner and group IDs, and the permission attributes in both symbolic and octal format. Finally we see the access (when the file was last read), modify (when the file was last written), and change (when the file attributes were last changed) times for the file. Using the -f option, we can examine file systems as well: bshotts@twin7:~$ stat -f / File: "/" ID: 9e38fe0b56e0096d Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 18429754 Free: 10441154 Available: 9504962 Inodes: Total: 4685824 Free: 4401092 Clearly stat delivers the goods when it comes to file information, but what about that output format? I can't think of anything worse to deal with from a script writer's point-of-view (actually I can, but let's not go there!). Here's where the beauty of stat starts to shine through. The output is completely customizable. stat supports printf-like format specifiers. Here is an example extracting just the name, size, and octal file permissions: bshotts@twin7:~$ stat -c "%n %s %a" .bashrc .bashrc 3800 644 The -c option provides basic formatting capabilities, while the --printf option can do even more by interpreting backslash escape sequences: bshotts@twin7:~$ stat --printf="%n\t%s\t%a\n" .bashrc .bashrc 3800 644 Using this format, we can produce tab-delimited output, perfect for processing by the cut command. Each of the fields in the stat output is available for formatting. See the stat man page for the complete list. Further Reading - The stat man pageThe Linux Command Line: - Chapter 10 (file attributes and permissions) - Chapter 21 (cut command) - Chapter 22 (printf command)A Wikipedia article on the stat() Unix system call from which the stat command is derived: - http://en.wikipedia.org/wiki/Stat_(Unix) -- Posted By William Shotts to LinuxCommand.org: Tips, News And Rants at 4/15/2010 04:39:00 PM |