Linux Stat Command Explained

Photo of author

By rasho

The stat command is used in Linux/Unix system to display detailed information about files and file systems. It is most commonly used to get file timestamps.
The Linux ls command usually gives you basic details about a file whereas stat command prints additional information about the file pulled from the inode.
This article explains how to use stat command.

Using the stat Command

The syntax for the stat command is as follows:

stat [OPTION]... FILE...

stat accepts one or more input FILE names and includes a number of options that control the command behavior and output.

Let’s take a look at the following example:

To display a file status such as size, inode number links, and file timestamps, run:

$ stat instrument.ino 
  File: instrument.ino
  Size: 4052      	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 4201227     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   rasho)   Gid: ( 1000/   rasho)
Access: 2021-01-31 22:28:29.529792705 +0100
Modify: 2021-01-31 22:36:27.407930430 +0100
Change: 2021-01-31 22:36:27.407930430 +0100
 Birth: -

When invoked without any options, stat displays the following file information:

  • File – The name of the file.
  • Size – The size of the file in bytes.
  • Blocks – The number of allocated blocks the file takes.
  • IO Block – The size in bytes of every block.
  • File type – (ex. regular file, directory, symbolic link.)
  • Device – Device number in hex and decimal.
  • Inode – Inode number.
  • Links – Number of hard links.
  • Access – File permissions in the numeric and symbolic methods.
  • Uid – User ID and name of the owner .
  • Gid – Group ID and name of the owner.
  • Context – The SELinux security context.
  • Access – The last time the file was accessed.
  • Modify – The last time the file’s content was modified.
  • Change – The last time the file’s attribute or content was changed.
  • Birth – File creation time (not supported in Linux).

[ads]

Check filesystem status

To prints out the filesystem status on which the file resides instead of giving information about the regular file, use -f or --file-system option.
For example:

$ stat -f instrument.ino
  File: "instrument.ino"
    ID: 19600ab60794303 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 28584489   Free: 15375618   Available: 13912834
Inodes: Total: 7299072    Free: 6494484

When stat is invoked with the -f option, it shows the following information:

When stat is invoked with the -f option, it shows the following information:

  • File – The name of the file.
  • ID – File system ID in hex.
  • Namelen – Maximum length of file names.
  • Fundamental block size – The size of each block on the file system.
  • Blocks:
    • Total – Number of total blocks in the file system.
    • Free – Number of free blocks in the file system.
    • Available – Number of free blocks available to non-root users.
  • Inodes:
    • Total – Number of total inodes in the file system.
    • Free – Number of free inodes in the file system.

[ads]

To follow symlinks

The stat command does not follow symlinks by default. When you run it on a symlink, the output comprises information about the symlink but not the file it points to.

$ stat /usr/share/zoneinfo/Europe/Belgrade
File: /usr/share/zoneinfo/Europe/Belgrade
Size: 1948 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 3818409 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-01-31 23:00:27.342347034 +0100
Modify: 2021-01-08 17:19:33.000000000 +0100
Change: 2021-01-21 19:20:00.774778445 +0100
Birth: -

To follow the symlink and print out information about the file it points to, use the -L option as shown:

$ stat -L /usr/share/zoneinfo/Europe/Belgrade
  File: /usr/share/zoneinfo/Europe/Belgrade
  Size: 1948      	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 3818409     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-01-31 23:00:27.342347034 +0100
Modify: 2021-01-08 17:19:33.000000000 +0100
Change: 2021-01-21 19:20:00.774778445 +0100
 Birth: -

Customizing the Output

The stat command has two options that allow you to customize the output according to your needs: -c, (--format="format") and --printf="format".
The difference between these two options is that when two or more files are used as operants --format automatically adds a newline after each operand’s output. The --printf interprets backslash escapes.
There are many format directives for files and file systems that can be used with --format and --printf.
For example, to view only the type of the file, you would run:

$ stat --format="%F" /dev/null

You can combine any number of formatting directives and optionally use custom separators between them. The separator can be a single character or a string:

$ stat --format="%n,%F" /dev/null

To interpret special characters like newline or tab, use the --printf option:

$ stat --printf='Name: %n\nPermissions: %a\n' /etc

\n prints a new line:

Name: /etc
Permissions: 755

Conclusion

The stat is a handy command to check file timestamps such as file modification or acess time. In this guide, we have covered the stat command in Linux and highlighted a few example usages.

Leave a Comment