Analyzing file metadata in the shell
Taking Stock

© Lead Image © Sebastian Duda, 123RF.com
Armed with the right shell commands, you can quickly identify and evaluate file and directory metadata.
Imagine you have a directory with hundreds or even thousands of files (without uniform extensions) that you want to organize. Or maybe you want to know the last access date of a file for backup, forensics, or version management purposes.
Instead of tediously clicking your way through the files in a graphical file manager, a shell script with the test
command can help identify filesystem objects as well as provide additional information about the files.
Determining File Type
The file
command provides information about a file's contents (Figure 1). Because it tests for patterns in the content, file
cannot be misled by file extensions (Figure 2).
file
gets its pattern information from the magic file /usr/share/misc/magic.mgc
. For special cases, you can create your own magic file and pass it in to file
by calling it with the option -m <filename>
. If you are particularly interested in MIME files, use the --mime-type
option.
You can even access and evaluate device files with file
. Additionally, it also outputs the major and minor numbers (Figure 3) – the major number specifies the kernel's device driver, while the minor number specifies the individual device managed by the device driver.

Given the appropriate privileges, you can obtain information about the filesystem (Figure 4). To do so, use the -s <device file>
option. If you only enter the device for the hard disk without the partition number, the output contains block size details, among other things.
file
usually outputs the information in the form <filename>: <data>
. You can take advantage of this when using the tool in shell scripts. If you use a for
loop in the script, you need unique file names. You can obtain these by typing ls -1
. This gives you one file name per line. The subshell in the loop header of the for
loop thus provides reliable arguments until a space occurs in the file name. To avoid this, you have to convert or quote the name.
Listing 1 shows a sample script that specifically searches for PDF files and displays them for selection (Figure 5). The dynamic selection menu is created with the help of Smenu.
Listing 1
pdflist.sh
01 #! /bin/bash 02 03 # Default quit menu 04 menu="E-N-D" 05 06 cd $HOME/Data 07 08 # Search for PDF files 09 for i in $(ls -1); do 10 file $i | cut -d \: -f2 | grep -q PDF 11 if [ $? -eq 0 ]; then 12 # Show selection 13 menu=$(echo $menu $i) 14 fi 15 done 16 17 # Selection menu with Smenu and PDF display 18 while true; do 19 choice=$(echo $menu | smenu -n 10 -t1 ) 20 if [ "$choice" = "E-N-D" ]; then 21 exit 22 fi 23 atril $choice 24 clear 25 done

Status Information
Similar to ls
, the stat
command provides file and directory details. Without specifying any other options, stat
outputs a full set of data for the listed files (Figure 6). Figure 6 also shows the effect of read access – note the Access
line with the date and time information. However, this feature does not work for filesystems mounted with the noatime
option. noatime
speeds up data access, because the filesystem does not have to create an entry whenever something is read.
Using stat -c <format>
you can read specific information about a file (or a filesystem) and evaluate it in a script. Table 1 shows formatting information for stat
. Figure 7 shows some calls, including querying access rights in numerical form. This information could be useful for an installation script.
Table 1
Stat Format Information
Syntax | Meaning |
---|---|
%a |
Access rights in numerical format |
%A |
Access rights in detailed format |
%d |
Device number (decimal) for a device file |
%t |
Major number device file (hexadecimal) |
%T |
Minor number device file (hexadecimal) |
%F |
File type |
%m |
Filesystem where the file resides |
%u |
Owner UID |
%U |
Owner username |
%g |
GID |
%G |
Group name |
%x |
Last read access (plain text) |
%X |
Last read access (Unix seconds) |
%y |
Last change (plain text) |
%Y |
Last change (Unix seconds) |
%z |
Last access (plain text) |
%Z |
Last access (Unix seconds) |
Note that stat
's output is a bit ambiguous: For example, Access
means the last read access, but you should note that mount options like noatime
influence this value. Modify
refers to the contents of the file, so it may contain the creation date, but always includes the last write access. Change
shows you information about changing access rights (the owner or similar). The value for Birth
is currently not determined by stat
on Linux due to a program error.
Listing 2 shows a small script that reads the access rights of a file and then changes them if they are too permissive. It calls the command to change permissions with the -v
option so you can see what it is doing in the terminal. Figure 8 shows the database for this; Figure 9 shows the script running.
Listing 2
restrictive.sh
01 #! /bin/bash 02 03 # Define $1 as directory, 04 # else cancel 05 if [ -z $1 ]; then 06 exit 07 fi 08 09 # Change to directory 10 cd $1 11 12 for i in $(ls -1); do 13 # Evaluate access permissions 14 stat -c %a $i | grep -q 75 15 if [ $? -eq 0 ]; then 16 # Change if group 17 # or anyone can execute 18 # the file. 19 chmod -v 700 $i 20 fi 21 done

Changing Timestamps
Applications that work with a file will typically modify the timestamp information. You can do this manually with the touch
command (see Table 2). If you run touch
for a nonexistent file name, the system creates a corresponding entry in the filesystem (i.e., it creates a file without any content). If you call touch <file>
without any options, the program updates all the timestamps in the file to the system time.
Table 2
Touch Options
Option | Action |
---|---|
-a |
Change access time |
-m |
Change last change time |
-t <time> |
Use <time> instead of system time |
-r <file> |
Provides a reference file from which touch takes the timestamp |
The time specification for the -t
option takes the form of <MMDDhhmm>
. You can also add the calendar year and seconds to the specification: <YYYYMMDDhhmm.ss>
. Figure 10 shows how to change the access time using touch
. Figure 11 shows an example of referencing an existing file for the timestamp. The stat
command's resulting output shows the special access date set by the command in Figure 10.
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Direct Download
Read full article as PDF:
Price $2.95
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Find SysAdmin Jobs
News
-
LibreOffice 7.5 has Arrived and is Loaded with New Features and Improvements
The favorite office suite of the Linux community has a new release that includes some visual refreshing and new features across all modules.
-
The Next Major Release of Elementary OS Has Arrived
It's been over a year since the developers of elementary OS released version 6.1 (Jólnir) but they've finally made their latest release (Horus) available with a renewed focus on the user.
-
KDE Plasma 5.27 Beta Is Ready for Testing
The latest beta iteration of the KDE Plasma desktop is now available and includes some important additions and fixes.
-
Netrunner OS 23 Is Now Available
The latest version of this Linux distribution is now based on Debian Bullseye and is ready for installation and finally hits the KDE 5.20 branch of the desktop.
-
New Linux Distribution Built for Gamers
With a Gnome desktop that offers different layouts and a custom kernel, PikaOS is a great option for gamers of all types.
-
System76 Beefs Up Popular Pangolin Laptop
The darling of open-source-powered laptops and desktops will soon drop a new AMD Ryzen 7-powered version of their popular Pangolin laptop.
-
Nobara Project Is a Modified Version of Fedora with User-Friendly Fixes
If you're looking for a version of Fedora that includes third-party and proprietary packages, look no further than the Nobara Project.
-
Gnome 44 Now Has a Release Date
Gnome 44 will be officially released on March 22, 2023.
-
Nitrux 2.6 Available with Kernel 6.1 and a Major Change
The developers of Nitrux have officially released version 2.6 of their Linux distribution with plenty of new features to excite users.
-
Vanilla OS Initial Release Is Now Available
A stock GNOME experience with on-demand immutability finally sees its first production release.