Autorun Keyboard Settings for Awesomewm Next »
h-entry Microformat for Indieweb Posts
Getting File Info From The Shell
I could right click for properties but the mouse is way over there
Use file
for everyday summaries. Use ExifTool when you need to know everything.
The problem
I am once again puttering around with my site.
I have an image here.
Do I need to resize it? Should find out how big it is first.
$ exa basement-original.jpg
Permissions Size User Date Modified Git Name
.rw-rw-r-- 131k random 20 Apr 9:04 -- basement-original.jpg
No I don’t mean file size. I mean geometry. How many pixels wide, and how many high? exa is nifty though. You should try it out.
I don’t want to leave my shell session to do it either. Sure that’s just stubbornness on my part. I could get the necessary information from my desktop’s file browser, but I type quicker than I click.
file
is everywhere
file
is a standard utility, which means it’s available on pretty much any Unix or Unix-like system you use. It works by matching a file’s internal details to entries in a magic
database and reporting its findings. magic
can be extended, though the details are beyond me for now.
$ file basement-original.jpg
basement-original.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 800x487, frames 3
basement-original.jpg
is a jpeg image. Yep, that checks out. Let’s see — 800x487. That looks like a geometry value. 800 pixels wide and 487 pixels high, if I remember the order right.
I want more detail, but this is all I can get from file
. That’s what ExifTool is for.
ExifTool knows everything
ExifTool lets me read and edit metadata for images, music, PDF, Word files, videos — the selection of file types supported by ExifTool is dizzying.
You can install ExifTool with the downloads listed on its site or using your favorite package manager.
brew install exiftool
Default usage returns every bit of information ExifTool thinks is relevant for the file type.
$ exiftool basement-original.jpg
ExifTool Version Number : 11.85
File Name : basement-original.jpg
Directory : .
File Size : 129 kB
File Modification Date/Time : 2020:04:20 09:04:28-07:00
File Access Date/Time : 2020:04:21 10:08:57-07:00
File Inode Change Date/Time : 2020:04:20 09:04:28-07:00
File Permissions : rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : inches
X Resolution : 72
Y Resolution : 72
Image Width : 800
Image Height : 487
Encoding Process : Progressive DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:4:4 (1 1)
Image Size : 800x487
Megapixels : 0.390
800 pixels wide, 487 pixels high. I remembered correctly! While I’m here, let’s look at ways to fine-tune the output.
We could cut down on the noise by specifying the fields or tags we want to see.
$ exiftool -ImageWidth -ImageHeight basement-original.jpg
Image Width : 800
Image Height : 487
We could use -S
for more compact output focused less on tabular layout.
$ exiftool -S -ImageWidth -ImageHeight basement-original.jpg
ImageWidth: 800
ImageHeight: 487
We could tell ExifTool to format its report for processing by CSV or JSON tools.
$ exiftool -j basement-original.jpg
[{
"SourceFile": "basement-original.jpg",
"ExifToolVersion": 11.85,
"FileName": "basement-original.jpg",
"Directory": ".",
"FileSize": "129 kB",
"FileModifyDate": "2020:04:20 09:04:28-07:00",
"FileAccessDate": "2020:04:21 10:08:57-07:00",
"FileInodeChangeDate": "2020:04:20 09:04:28-07:00",
"FilePermissions": "rw-rw-r--",
"FileType": "JPEG",
"FileTypeExtension": "jpg",
"MIMEType": "image/jpeg",
"JFIFVersion": 1.01,
"ResolutionUnit": "inches",
"XResolution": 72,
"YResolution": 72,
"ImageWidth": 800,
"ImageHeight": 487,
"EncodingProcess": "Progressive DCT, Huffman coding",
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "YCbCr4:4:4 (1 1)",
"ImageSize": "800x487",
"Megapixels": 0.390
}]
Hang on. I feel compelled to be a bit fancy.
Piping to xsv for aggregate information about site images.
$ exiftool -csv -r content \
| xsv search -s MIMEType 'image/.+' \
| xsv select ImageWidth,ImageHeight \
| xsv stats \
| xsv select field,min,max,mean \
| xsv table
682 directories scanned
419 image files read
field min max mean
ImageWidth 27 5120 1337.1172248803825
ImageHeight 27 4032 1009.7368421052624
Hm. I must have some icon files in there somewhere.
For more fun, point it at some music files. Heck, it will try to give useful information for text!
$ exiftool index.adoc
ExifTool Version Number : 11.85
File Name : index.adoc
Directory : .
File Size : 4.8 kB
File Modification Date/Time : 2020:04:21 12:58:13-07:00
File Access Date/Time : 2020:04:21 12:58:14-07:00
File Inode Change Date/Time : 2020:04:21 12:58:13-07:00
File Permissions : rw-rw-r--
File Type : TXT
File Type Extension : txt
MIME Type : text/plain
MIME Encoding : us-ascii
Newlines : Unix LF
Line Count : 189
Word Count : 619
Here’s the file
output in comparison.
$ file index.adoc
index.adoc: ASCII text
I could probably write some magic
configuration to get more information. But installing ExifTool was easier.
Good enough?
file
is universally available and gave me the details I needed today. ExifTool gives me everything I needed and then some. I’ll most likely keep it available on my systems.
And no, I’m not going to worry about resizing that image for now.