Hacks

From Jon's Wiki

Image renaming by create date

When you have a bunch of files from your old Android phone with a timestamp filename (e.g. 1388042328550.jpg), you can rename them thus:

for f in 1*.jpg; do
  mv $f $(date +IMG_%Y%m%d_%H%M%S.jpg -d @$(echo $f|cut -c 1-10))
done

Otherwise, we can fish out the Create Date from the EXIF data, using exiftool:

exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e .

Use etckeeper

It saves your bacon. Store changes to the /etc directory in git, uses hooks to commit changes when packages are updated, puppet runs, etc. Stash your own changes with useful commit messages. Look up stuff in history when something goes wrong, figure out what changes happened when packages are added or updated.

Fix the daily commit bug

Unfortunately since about 18.04 there is a bug where a systemd timer and a cron.daily task compete to commit a daily commit if needed; unfortunately one of them doesn't bother to check the etckeeper.conf file to see whether you've disabled it. If you have DISABLE_DAILY_AUTOCOMMITS=1 in your config file, then you probably don't want daily auto commits. If this is so, run this to disable the systemd timer:

systemctl disable --now etckeeper.timer

Repair broken or rotated phone videos

You can fix broken video .tmp files from your Android phone using untrunc. This will create a fixed.mp4 file in cwd:

untrunc working_video_from_the_same_camera.mp4 broken.mk4.tmp

Did your phone unhelpfully rotate your video? Fix the metadata:

ffmpeg -i original.mp4 -acodec copy -vcodec copy -metadata:s:v:0 rotate=0 unrotated.mp4

Or, did you actually film your shit the wrong way up? You'll need to re-encode it:

ffmpeg -i original.mp4 -acodec copy -vcodec libx264 -crf 20 -metadata:s:v:0 rotate=0 unrotated.mp4

Export your photos

Before uploading your photos, remove all the EXIF tags, and reduce the resolution; nobody needs 5000x4000 pixels, much less corporations hoovering up your stuff to put in adverts.

mkdir tmp
for f in $.jpg; do
  convert -resize 1600x1200 $f tmp/$f
  exiftool -all= -P -overwrite_original tmp/$f
done

Clean out your revoked and expired PGP keys

Spring-clean your gpg database, make it go faster. Just go:

gpg --delete-keys $(gpg --list-public-keys|grep -PB1 'expired|revoked'|grep '^\s')

Obviously. If you can't be arsed confirming each key, add --batch --yes to the first gpg call.

Firefox opening your shit in gedit

I don't know, who thought that was a good idea? Jesus.

sed -i 's#.*octet-stream.*#application/octet-stream=xdg-open#' ~/.local/share/applications/mimeapps.list ~/.config/mimeapps.list

GNOME not sorting your folders first

It's not in a dialog anywhere, and a pretty lame default behaviour.

dconf write /org/gnome/nautilus/preferences/sort-directories-first true

GNOME not dealing with WebP images

I mean, it's 2021 and WebP is only what, ten years old? Jesus. See solution on AskUbuntu.

Restoring huge databases to PostgreSQL

See also: PostgreSQL

Skip some huge tables by dumping the TOC, removing culprit large tables, and restore with the edited TOC, e.g.

pg_restore -l huge.dump > TOC
# edit the TOC file...
pg_restore -L TOC -d dbname huge.dump

Output PostgreSQL queries to CSV

COPY (SELECT <query> ...) TO STDOUT CSV HEADER;

Turn off the shitty default "visual" mouse mode in vim

Add this to /etc/vim/vimrc.local file:[1]

" Use skip_defaults_vim from the master /etc/vim/vimrc file
if ! exists('skip_defaults_vim')
  " Source the defaults file manually from here
  source $VIMRUNTIME/defaults.vim
endif

" Avoid loading the defaults twice
let g:skip_defaults_vim = 1

" Revert any unwanted changes the defaults file introduced
set mouse=

Too many leftover git branches merged into master? Nukem!

This will remove any branches on your local git repo that have been merged to master.

for i in $(for b in $(git branch|grep -v '\*'); do git branch $b --merged master; done); \
    do git branch -D $i; \
done

Move your MySQL databases

Used to be you could move your /var/lib/mysql directory somewhere else and symlink it. You can, but in newer distros with Apparmor you'll need to declare it:

# In /etc/apparmor.d/tunables/alias
alias /var/lib/mysql/ -> /mnt/wherever/mysql/,

Note the trailing comma.

Split audio CD rips using the cue file

Single-file FLAC or Ape files of a CD can be split up using the .cue file for both the timestamps and the tagging data. Also, install flacon (from a PPA).

sudo apt install shntool
shnsplit -o flac cdimage.flac -f cdimage.cue -t '%n.%t'

You may need to do tags again, if they didn't stick:

sudo apt install cuetools
cuetag cdimage.cue *.flac

Ditch Snap

1. Install Firefox properly

Ubuntu 22.04 replaces the Firefox Debian package with a pseudo-package that installs it using Snap. This is no longer optional, and it is also stupid, annoying, slow, and potentially insecure for many reasons.[2] Several Firefox extensions that need to talk to other applications don't currently work in Snap installed Firefox, including things like Zotero and Keepass.

It also completely fails to find and import any existing Firefox profile. Snap apps for whatever stupid reason keep settings in a hard-coded ~/snap folder. Who thought that was a good idea? What's wrong with ~/.config and/or ~/.local, or couldn't they even use ~/.snap? Good grief.

Luckily, we can use the Mozilla Team PPA instead.[3] In summary:

# Remove Firefox entirely:
snap remove firefox
apt remove firefox

# Add the Mozilla Team PPA and install:
add-apt-repository ppa:mozillateam/ppa
apt update
apt install -t 'o=LP-PPA-mozillateam' firefox

# Pin to the Mozilla Team PPA so we never get the Snap pseudo-package
echo 'Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 501' > /etc/apt/preferences.d/mozillateam-ppa.pref

2. Remove snap

You can also remove snap entirely as follows:

# get a list of things installed with snap:
snap list

# remove them one by one:
snap uninstall ''program1''
snap uninstall ''program2''

# once there's nothing left, remove snap:
apt purge snapd

# then prevent it ever being re-installed with a pin preference:
echo 'Package: snapd
 Pin: release a=*
 Pin-Priority: -10' > /etc/apt/preferences.d/no-snap.pref

Fancy PostgreSQL prompts

For a coloured prompt including what user, connection, and host you're on, stick this in ~/.psqlrc or /etc/postgresql-common/psqlrc:

\set PROMPT1 '%[%033[1m%](%n@%[%033[1;35m%]%M%[%033[m%]%[%033[1m%] on %[%033[1;31m%]%`hostname`%[%033[m%]%[%033[1m%]) \n%/%R%#%[%033[m%] '
\set PROMPT2 '%[%033[1m%]%/%R%#%[%033[m%] '
\set PROMPT3 '%[%033[1m%]>>%[%033[m%] '

Escape codes use '%' character, documented here: Psql Prompts.

Using rsync with FAT volumes (USB sticks and SD cards)

You might have noticed that all your files have today's timestamp on them when using rsync thus:

rsync -av /path/to/my/stuff /mnt/usb-stick/

The -a option means -rlDtpog, which is recursive, include links and devices, preserving timestamps, permissions, owner and group. Which is what you want most of the time. Trouble is, FAT partitions have no concept of permissions, owners and groups, so you need to use:

rsync -rtlDv /path/to/my/stuff /mnt/usb-stick/

But that's probably not all, because rsync will probably complain that it can't set the timestamp. You'll need to mount your USB stick so it ignores a user check that FAT can't enforce:

mount -o remount,allow_utime=2 /mnt/usb-stick

Notes

  1. Böhnke, H (16 March 2019). Answer 506723 on "Disabling mouse support in vim in a gnome-terminal environment", Unix & Linux Stack Exchange.
  2. Brandon Hopkins. "Flatpak vs. Snap vs. AppImage - Linux Packaging Benchmarks" TechHut, April 2022.
  3. Ji M. "How to Install Latest Firefox as classic Deb in Ubuntu 22.04" Ubuntu Handbook, April 2022.