tar

Backup

See Ubuntu Help for details.

# Full root file system backup
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /

# Backup remote file system (SSH)
ssh root@srv.local -p 22 "tar -cvpz --one-file-system /" > srv-backup.tar.gz

# Restore
tar -xvpzf /path/to/backup.tar.gz -C /media/whatever --numeric-owner

Other useful commands

# Remove compression from tar.gz
gzip -dk archive.tar.gz

# Compress directory
tar -zcvf myfolder.tar.gz myfolder

# Read gzipped log
zcat error.log.2.gz

Logoff desktop shortcut for all users on Windows Server

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:PUBLIC\Desktop\Logoff.lnk")
$Shortcut.TargetPath = "C:\Windows\System32\shutdown.exe"
$Shortcut.Arguments = "/l"
$Shortcut.IconLocation = "C:\Windows\System32\shell32.dll,44"
$Shortcut.Save()

ImageMagic

# Image from PDF
convert -density 300 -rotate 90 -compress lossless input.pdf[0] output.jpg

# Icon from multiple images
convert image1.png image2.png image3.png favicon.ico

# Create favicon.ico with multiple sizes
convert favicon.png -define icon:auto-resize=96,64,48,32,16 favicon.ico

postfix

# Show current mail queue
mailq

# Send messages in queue
postqueue -f

# Delete message from queue
postsuper -d MSGID

# Print message from queue
postcat -q MSGID

# Show mail statistics
cat /var/log/mail.log | pflogsumm

# Rebuild aliases
newaliases

journalctl

# Follow postfix mail log with 40 records loaded on start
journalctl -f -u postfix@-.service -n 40

# Get one day old records
journalctl -u postfix@-.service --since "1 days ago"

# Get first 100 records since
journalctl --since "2026-03-27 07:00:00" --no-pager | head -100

du

# Find files / directories bigger than 1GB
du -a --threshold=1G ./

# Top 20 directories by size
du -a / --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/lost+found | sort -n -r | head -n 20

# Get directory size recursively
du -hs ./

patch

# Create patch for file
diff -Naur original_file modified_file > changes.patch

# Test
patch --dry-run file_to_be_patched changes.patch

Convert 2FAuth TOTP codes to Bitwarden Authenticator

  1. Select codes in 2FAuth and export them as a list of otpauth URIs.
  2. Save the Python script below as convert-2fauth-to-bitwarden.py
  3. Run the command below to create Bitwarden Authenticator JSON export file.
python3 convert-2fauth-to-bitwarden.py -o bitwarden_export.json 2fauth_export_otpauth.txt
#!/usr/bin/env python3
import json
import uuid
import argparse

def parse_otpauth_uri(uri):
    parts = uri.split('?')
    label = parts[0].split('/')[-1]
    service, account = label.split(':', 1) if ':' in label else (label, '')
    return {'service': service, 'account': account}

def convert_otpauth_to_bitwarden(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        uris = [line.strip() for line in f if line.strip().startswith('otpauth://')]
    
    items = []
    for uri in uris:
        parsed = parse_otpauth_uri(uri)
        bw_item = {
            "id": str(uuid.uuid4()).upper(),
            "type": 1,
            "name": f"{parsed['service']}",
            "favorite": False,
            "login": {
                "username": parsed['account'],
                "totp": uri,
            }
        }
        items.append(bw_item)
    
    output = {"encrypted": False, "items": items}
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(output, f, indent=2, ensure_ascii=False)
    
    print(f"Converted {len(items)} items to {output_file}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Convert otpauth URIs → Bitwarden JSON")
    parser.add_argument("input", help="File with otpauth URIs")
    parser.add_argument("-o", "--output", default="bitwarden_export.json")
    args = parser.parse_args()
    convert_otpauth_to_bitwarden(args.input, args.output)