Skip to content

Linux and Bash tables

Useful cheatsheet tables for Linux and Bash.

Filesystem

Types of inodes

type in ls description
regular file - real file
directory d real directory
symbolic link l pointer to another inode
character device c unbuffered device like a terminal or /dev/null
block device b buffered device like a disk or partition
socket s UNIX domain socket for IPC
named pipe (FIFO) p named pipe for IPC

Table 1. Inode types with associated symbols in ls -l

Attributes of inodes

attribute applies to Description
st_ino all inode number
st_mode all type and permissions (bitmask)
st_nlink all number of hard links
st_uid all owner user ID
st_gid all owner group ID
st_size file, symlink size in bytes
st_atime all last access
st_mtime all last modification
st_ctime all last status change (e.g. owner)
st_blksize all preferred I/O block size
st_blocks all number of 512-byte blocks allocated
st_rdev char device, block device device id (major+minor)

Timestamp types per OS

OS atime mtime ctime birthtime/crtime “Date Added” †
POSIX
Linux ○ ‡ ○ §
BSD ○ ‡
macOS ○ ‡ ○ †
Windows ♯ ○ ‡ ✔ ◊ ✔ ◊ ✔ ◊

Table 2. Timestamp types per OS. ✔: mandatory; ○: optional.

“Date Added” is macOS-specific and is not filesystem metadata (including xattr); instead, it’s a Spotlight property of the containing directory. The Spotlight server, mds, subscribes to APFS events, and tags the values immediately. Incorrect and/or missing values occur if Spotlight is disabled or its database is rebuilt.\ atime updates can be disabled or delayed (e.g. noatime, relatime).\ § birthtime (crtime in ZFS) available via statx on at least Btrfs, ext4, XFS. Not portable.\ § NTFS and ReFS define timestamps relative to the Windows Epoch, 1601-01-01T00:00:00Z.\ NTFS and ReFS store access, modified, change, and birth times. Unfortunately, they call modified time ctime and birth time ctime.

Bash

Bash [[ ]] test operators

operator syntax meaning
== str1 == str2 str1 equals str2
!= str1 != str2 str1 does not equal str2
< str1 < str2 str1 precedes str2
> str1 > str2 str succeeds str2
=~ str =~ regex str matches regex pattern
-v -v var var is a defined variable
-z -z str str is empty
-n -n str str is nonempty
-e -e path path exists
-f -f path path is a regular file
-d -d path path is a directory
-L -L path path is a symbolic link
-h -h path (alias for -L)
-b -b path path is a block device
-c -c path path is a character device
-p -p path path is a named pipe
-S -S path path is a socket
-u -u path path has set-user-ID bit
-g -g path path has set-group-ID bit
-k -k path path has sticky bit
-O -O path path is owned by effective user
-G -G path path is owned by effective group
-s -s file file is nonempty
-r -r file file is readable
-w -w file file is writable
-x -x file file is executable
-t -t descriptor descriptor is a tty
-nt path1 -nt path2 path1 is newer than path2
-ot path1 -ot path2 path1 is older than path2
-ef path1 -ef path2 path1 is the same inode as path2
-N -N path path has mtime > atime

Table 3. Test operators ([[ ]]).

Testing whether a name is defined

syntax meaning notes
type name > /dev/null name is defined general
alias name > /dev/null name is an alias
declare -F name name is a function always true in ZSH
typeset -f myfunc > /dev/null name is a function

Table 4. Other common tests.

Core utilities

Format specifiers by printf flavor

Note

find -printf (man7 link) is not related to find.

Specifier Meaning Bash C awk
%s String
%b Escapes processed string
%d Signed decimal integer
%i Signed decimal integer
%u Unsigned decimal integer
%x Unsigned hex (lowercase)
%X Unsigned hex (uppercase)
%o Unsigned octal
%f Float (fixed-point)
%e Float (scientific, lowercase)
%E Float (scientific, uppercase)
%g Float, shortest of %f or %e
%G Float, shortest of %f or %E
%c Single character
%p Pointer or path
%n Store # chars written (C only) ⚠️
%% Literal percent sign
%q Shell-escaped string
%Nd Zero-padded to N chars
%-Ns Left-aligned string

⚠️ = dangerous and should not be used