You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.7 KiB

CLI Cheatsheet

Contents


Drupal / Drush

Note: These SQL queries target the Drupal 7 schema (node_type table). They won't work as-is on Drupal 8+.

List content types with node counts

drush sqlq 'select count(node.nid) as node_count, node_type.type
            from node
            inner join node_type on node.type = node_type.type
            group by node_type.type'

Filter results by keyword (e.g. "2014")

drush sqlq 'select count(node.nid) as node_count, node_type.type
            from node
            inner join node_type on node.type = node_type.type
            group by node_type.type' | grep 2014

Text Processing

Find and replace inside files (perl)

# Single file type in current directory
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt

# Recursively across all file types
perl -pi -w -e 's/thex/robertsonlibrary/g;' **/*.*

Find and replace in file names

# Rename files matching a pattern, verbose output shows what changed
rename 's/livero/lives/g' **/*.* -v

Torrents

# aria2c is a lightweight multi-protocol download utility
aria2c -d ~/Downloads "magnetlink"

PDF Tools

OCR a PDF (ocrmypdf)

# Standard: optimize output, skip pages that already have a text layer
ocrmypdf --optimize 3 --skip-text input.pdf output.pdf

# Aggressive: force re-OCR even if a text layer exists (useful for corrupt/bad layers),
# set DPI manually, use page segmentation mode 1 (automatic with OSD)
ocrmypdf --optimize 3 --image-dpi 300 --output-type pdf \
         --force-ocr --tesseract-pagesegmode 1 input.pdf output.pdf

Downsample a PDF to 72dpi (Ghostscript)

# Single file
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
   -dPDFSETTINGS=/screen \
   -dNOPAUSE -dQUIET -dBATCH \
   -sOutputFile=output.pdf input.pdf

# Batch - processes all PDFs in current folder, preserves original filenames
mkdir -p downsampled
for f in *.pdf *.PDF; do
    [ -f "$f" ] || continue
    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
       -dNOPAUSE -dBATCH -dQUIET \
       -sOutputFile="downsampled/$f" \
       "$f"
done

Check image DPI in PDFs (pdfimages)

# Print image info to terminal
for f in *.pdf *.PDF; do
    echo "=== $f ==="
    pdfimages -list "$f"
    echo ""
done

# Save output to images_list.txt instead (appends; delete the file first to start fresh)
for f in *.pdf *.PDF; do
    [ -f "$f" ] || continue
    echo "=== $f ===" >> images_list.txt
    pdfimages -list "$f" >> images_list.txt
    echo "" >> images_list.txt
done

Scan for CCITT encoding

CCITT is a fax-era compression format - this flags PDFs that may cause compatibility issues.

for f in *.pdf *.PDF; do
    [ -f "$f" ] || continue
    if pdfimages -list "$f" 2>/dev/null | grep -q " ccitt "; then
        echo "$f uses CCITT"
    fi
done

PDF Sheet Music

Check page size

pdfinfo filename.pdf

Resize to letter

gs -sDEVICE=pdfwrite \
   -sPAPERSIZE=letter \
   -dFIXEDMEDIA \
   -dPDFFitPage \
   -dNOPAUSE -dBATCH \
   -sOutputFile=output.pdf input.pdf

Batch resize to letter

mkdir -p resized_music
for f in *.pdf; do
    gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage \
       -dNOPAUSE -dBATCH -sOutputFile="resized_music/$f" "$f"
done

Audiobooks

Split an m4b into MP3 chapters (m4b-tool via Docker)

cd to the desired directory, create an input dir, put the m4b file in it, then run:

docker run --rm -it \
  -v "$(pwd)":/data \
  sandreas/m4b-tool \
  split "/data/input/The Haunting of Hill House.m4b" \
  --audio-format mp3 \
  --audio-bitrate 128k \
  --audio-channels 1 \
  --output-dir "/data/split" \
  -vv

Split an m4b by chapter (ffmpeg)

Reads chapter end times with ffprobe and writes chapter_000.mp3, chapter_001.mp3, etc.

ffmpeg -i Chaos.m4b -map 0:a -f segment \
  -segment_times $(ffprobe -i Chaos.m4b -show_chapters -loglevel error \
    | grep end_time | cut -d= -f2 | tr '\n' ',' | sed 's/,$//') \
  -c:a libmp3lame -q:a 2 chapter_%03d.mp3

Large File Transfer (rclone)

Copy to Google Drive

rclone copy file_location file_destination \
  --progress \
  --transfers 4 \
  --checkers 8 \
  --retries 10 \
  --low-level-retries 20 \
  --drive-chunk-size 64M \
  --log-file rclone.log \
  --log-level INFO