Unix commands I need often

but which are tedious to work anew out each time

General, not macOS-specific or Linux-specific, and see also shell to yak-shave your way into whole other shell paradigms. See, more specifically, fish and bash.

I suppose if I were a good person I’d submit the following to tldr or version my .cheats folder in my dotfile repo, but I’m now exhausted and just want to go home.

File system watching

Watch That Filesystem, by Al Williams, discusses how to trigger things based on filesystem events via inotifywait and incron.

Thanks Yohans Bastian for pointing out this handy trick to find the PID of the process using the inotify watchers.

find /proc/*/fd \
    -lname anon_inode:inotify \
    -printf '%hinfo/%f\n' 2>/dev/null \
    | xargs grep -c '^inotify'  \
    | sort -n -t: -k2 -r

Which file is crashing/hanging $PID?

lsof -r -p $PID | grep /path/to/file

Vars, expansions, file names, white space hell

See bash or fish depending on your choice of shell.

Or avoid both by using some other utility. rename is a script that makes renaming work how you imagine it should, avoiding the mysterious punctuation stew at least somewhat.

rename -s html txt *.html

NB depending on your distro you may get some other systutil rename which is much less powerful than the one I linked to, albeit still often powerful enough.

Text processing

Trailing whitespace

A shell script to remove trailing whitespace from a file - put this in trimspace.sh:


# macOS version
sed -i '' -e’s/[[:space:]]*$//' "$1"

# GNU version
sed -i -e’s/[ \t]*$//' "$1"

Then you can trim trailing whitespace from your… whatever… by putting this line in there:

find . -type f -print0 | xargs -0 -I {} trimspace.sh \{\}

Data wrangling

See text data processing.


Download from command line without getting owned

Default curl is insecure.

curl --tlsv1.2 --proto =https --location --remote-name-all --remote-header-name

Find common diacritics in filenames

because of some kind of unicode strife

find . -iname "*[üñàáèéöäçã]*"

Which process is bound to port $PORT?

this one.

lsof -nP -i4TCP:$PORT | grep LISTEN

Sync only if drive present

test -d  /Volumes/syncdrive/ && rsync --delete -avz \ /Volumes/syncdrive/

Set operations



Command lines to command your command lines.


Explainshell dissects a shell command and shows you the documentation for each part of it. Amazing for instilling this knowledge in your brain.



New to the command-line world? Or just a little rusty? Or perhaps you can’t always remember the arguments to lsof, or tar?

…And the manual is utterly incomprehensible, so remembering is obviously preferable to trying to decipher it.


npm install -g tldr


brew install tldr


tldr tar



…allows you to create and view interactive cheatsheets on the command-line. It was designed to help remind *nix system administrators of options for commands that they use frequently, but not frequently enough to remember.

pip install cheat
cheat tar

bro pages

bro pages:

…are a highly readable supplement to man pages. Bro pages show concise, common-case examples for Unix commands. The examples are submitted by the user base, and can be voted up or down; the best entries are what people see first when they look up a command.

bropages is conspicuously silent on why they chose “bro”, although they do have perhaps the nicest social editing workflow to compensate for the unfortunate choice.

gem install bropages
bro tar

how do i


Are you a hack programmer? Do you find yourself constantly Googling for how to do basic programing tasks?

Suppose you want to know how to format a date in bash. Why open your browser and read through blogs (risking major distraction) when you can simply stay in the console and ask howdoi

$ pip install howdoi
$ howdoi tar

Seems to search the internet for you, and not be command-line specific, which is broader in scope than some of the other entrants here, but also noisier.



is basically bro pages bit with a more esoteric API for querying and no integration of the social features.

$ curl https://www.commandlinefu.com/commands/matching/tar/dGFy/sort-by-votes/plaintext

The dGFy bit is a base64 encoding of tar for some godawful reason.

bash hackers wiki

bash hackers wiki: avoid its the paradigmatically awful bash manual