Introduction
In the Linux operating system, files and directories contain important metadata beyond just their contents. This metadata includes information such as file permissions, ownership, size, and various timestamps. The Linux stat command provides a powerful way to retrieve and display this detailed information about files and directories.
In this lab, you will learn how to use the stat command to examine file metadata, understand different timestamp types, and customize the output format to extract specific information. These skills are essential for system administration, troubleshooting file permission issues, and monitoring file changes.
Basic Usage of the Stat Command
The stat command in Linux provides comprehensive information about files and directories. In this step, we will learn how to use the basic form of the stat command and understand its output.
Understanding the Stat Command
The stat command reveals metadata information that is not typically visible with regular commands like ls. This metadata includes:
- File size and block allocation
- Inode information
- Access permissions
- User and group ownership
- Various timestamps
- File type
Creating a Test File
Let's start by creating a simple text file that we can use throughout this lab:
echo "This is a test file for the stat command." > ~/project/testfile.txt
Execute the above command in your terminal. This will create a file named testfile.txt in the project directory with a single line of text.
Using the Basic Stat Command
Now, let's examine the metadata of the file we just created using the stat command:
stat ~/project/testfile.txt
You should see output similar to the following:
File: /home/labex/project/testfile.txt
Size: 41 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 12345678 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ labex) Gid: ( 1000/ labex)
Access: 2023-04-28 10:30:00.000000000 +0000
Modify: 2023-04-28 10:30:00.000000000 +0000
Change: 2023-04-28 10:30:00.000000000 +0000
Birth: -
Understanding the Output
Let's break down the key elements of this output:
- File: The full path to the file
- Size: The size of the file in bytes
- Blocks: Number of allocated blocks
- IO Block: The block size for file system I/O
- Device: The device ID in hex/decimal
- Inode: The inode number (a unique identifier for the file)
- Links: Number of hard links
- Access: File permissions in both numeric (octal) and symbolic format
- Uid/Gid: User ID and Group ID of the file owner
- Access/Modify/Change/Birth: Different timestamps related to the file
The timestamps are particularly important:
- Access: When the file was last read
- Modify: When the file content was last modified
- Change: When the file's metadata was last changed
- Birth: Creation time (not available on all file systems)
Now you have learned how to display and interpret basic file metadata using the stat command.
Exploring File Timestamps and Permissions
In this step, we will explore file timestamps in more detail and learn how to modify file permissions. Understanding these aspects of file metadata is crucial for file management and security.
Understanding File Timestamps
As we saw in the previous step, Linux maintains several timestamps for each file:
- Access time (atime): Updated when a file is read
- Modification time (mtime): Updated when a file's content changes
- Change time (ctime): Updated when a file's metadata (permissions, ownership) changes
- Birth time (btime): Records when the file was created (not available on all file systems)
Let's demonstrate how these timestamps change:
- First, check the current timestamps of our test file:
stat ~/project/testfile.txt
- Now, let's modify the file content:
echo "Adding a new line to change the modification time." >> ~/project/testfile.txt
- Check the timestamps again:
stat ~/project/testfile.txt
You should notice that both the modification time (Modify) and the change time (Change) have been updated, since we changed the file's content.
Working with File Permissions
File permissions determine who can read, write, or execute a file. The stat command shows permissions in both symbolic format (-rw-r--r--) and numeric format (0644).
Let's explore how to view and modify permissions:
- First, check the current permissions of our test file:
stat -c '%A %a %n' ~/project/testfile.txt
This command uses the -c option to display a custom format:
%Ashows the permissions in symbolic format%ashows the permissions in octal (numeric) format%nshows the filename
The output should look something like:
-rw-r--r-- 644 /home/labex/project/testfile.txt
- Now, let's change the permissions:
chmod 755 ~/project/testfile.txt
This command changes the permissions to 755, which means:
- Owner has read, write, and execute permissions (7 = 4+2+1)
- Group has read and execute permissions (5 = 4+1)
- Others have read and execute permissions (5 = 4+1)
- Check the permissions again:
stat -c '%A %a %n' ~/project/testfile.txt
The output should now show:
-rwxr-xr-x 755 /home/labex/project/testfile.txt
- Let's also check how the change time was affected:
stat ~/project/testfile.txt | grep Change
You should notice that the Change timestamp has been updated because we modified the file's metadata (permissions).
Understanding timestamps and permissions is essential for system administration and troubleshooting file access issues. With the stat command, you can easily monitor these aspects of file metadata.
Using Custom Formats with the Stat Command
One of the most powerful features of the stat command is the ability to customize its output format. This is particularly useful when you need specific information about files or when you want to use the output in scripts.
The Format Option
The stat command provides the -c or --format option to customize the output format. This option allows you to specify a format string that determines what information is displayed and how it is formatted.
Let's create another test file to work with:
echo "This is another test file." > ~/project/second_file.txt
Format Specifiers
The stat command supports various format specifiers that start with %. Here are some of the most commonly used ones:
%n: File name%s: File size in bytes%b: Number of blocks allocated%u: User ID of owner%U: User name of owner%g: Group ID of owner%G: Group name of owner%a: Access rights in octal (numeric) format%A: Access rights in human-readable format%x: Time of last access%y: Time of last modification%z: Time of last change
Let's try some examples:
- Display the file name and size:
stat -c '%n is %s bytes' ~/project/testfile.txt
Output should look like:
/home/labex/project/testfile.txt is 85 bytes
- Display the owner and permissions:
stat -c 'Owner: %U, Permissions: %A' ~/project/testfile.txt
Output should look like:
Owner: labex, Permissions: -rwxr-xr-x
- Display multiple pieces of information:
stat -c 'File: %n\nSize: %s bytes\nOwner: %U\nPermissions: %A\nModified: %y' ~/project/testfile.txt
This command displays the file name, size, owner, permissions, and modification time, each on a new line.
- Compare information for multiple files:
stat -c '%n: %s bytes, modified %y' ~/project/testfile.txt ~/project/second_file.txt
This command displays the name, size, and modification time for both files.
Using Stat in Scripts
The custom format feature is particularly useful in shell scripts when you need to extract specific information. Let's create a simple script that calculates the total size of multiple files:
echo '#!/bin/bash
total=0
for file in "$@"; do
size=$(stat -c "%s" "$file")
echo "File: $file, Size: $size bytes"
total=$((total + size))
done
echo "Total size: $total bytes"' > ~/project/file_size.sh
chmod +x ~/project/file_size.sh
Now, let's run the script on our test files:
~/project/file_size.sh ~/project/testfile.txt ~/project/second_file.txt
The output should show the size of each file and the total size.
By mastering the custom format option of the stat command, you can efficiently extract and process file metadata to suit your specific needs.
Working with Directories and File Systems
In this step, we will explore how to use the stat command with directories and file systems. This knowledge is valuable for system administration tasks and understanding storage usage.
Stat Command with Directories
The stat command works with directories in the same way it works with files. Let's create a test directory and examine its metadata:
mkdir -p ~/project/test_dir
stat ~/project/test_dir
You should see output similar to what we saw for files, but with "directory" instead of "regular file" in the file type field.
The main difference between files and directories is that directories typically have more links (one for each immediate subdirectory plus two for the directory itself and its parent).
Let's create a subdirectory and see how it affects the link count:
mkdir -p ~/project/test_dir/sub_dir
stat ~/project/test_dir
You should notice that the link count has increased by 1.
File System Information
The stat command can also provide information about file systems using the -f or --file-system option. This option shows details like the file system type, block size, and usage statistics.
Let's examine the file system that contains our project directory:
stat -f ~/project
The output should include:
- File system type
- Block size
- Total blocks
- Free blocks
- Available blocks (for non-root users)
- Total inodes
- Free inodes
This information is useful for monitoring disk space usage and planning capacity.
Combining Options
We can combine the file system option with the custom format option to extract specific information:
stat -f -c 'File System: %T\nTotal size: %b blocks\nFree: %f blocks\nAvailable: %a blocks' ~/project
This command displays the file system type, total blocks, free blocks, and available blocks.
Following Symbolic Links
By default, when the stat command encounters a symbolic link, it shows information about the link itself, not the file it points to. Let's create a symbolic link and see this in action:
echo "Target file content" > ~/project/target_file.txt
ln -s ~/project/target_file.txt ~/project/symlink.txt
stat ~/project/symlink.txt
The output should show that the file type is "symbolic link" and the size is the length of the path to the target file.
To see information about the target file instead of the link, use the -L or --dereference option:
stat -L ~/project/symlink.txt
Now the output should show information about the target file, including its size and type as "regular file".
Practical Application: Finding Large Directories
One practical application of the stat command is to find large directories. Let's create a script that calculates directory sizes:
echo '#!/bin/bash
for dir in "$@"; do
if [ -d "$dir" ]; then
size=$(du -s "$dir" | cut -f1)
echo "Directory: $dir, Size: $size KB"
else
echo "$dir is not a directory"
fi
done' > ~/project/dir_size.sh
chmod +x ~/project/dir_size.sh
Now, let's run the script on our test directory:
~/project/dir_size.sh ~/project/test_dir
This script uses the du command to calculate directory sizes, complementing the metadata information provided by the stat command.
By understanding how to use the stat command with directories and file systems, you can gain valuable insights into your Linux system's storage organization and usage.
Summary
In this lab, you have learned how to use the Linux stat command to retrieve and analyze file metadata. You have explored:
- The basic usage of the
statcommand to display comprehensive file information - How to understand and work with file timestamps and permissions
- Using custom formats to extract specific metadata information
- Working with directories and file systems to gain insights into storage usage
These skills are valuable for system administration, troubleshooting file access issues, monitoring file changes, and understanding storage organization. The stat command provides a window into the detailed metadata that Linux maintains for every file and directory, allowing you to gain deeper insights into your file system.
By mastering the stat command and its various options, you have added a powerful tool to your Linux toolkit that can help you manage files more effectively and diagnose issues more efficiently.



