# CLI Cheatsheet ## Contents - [Drupal / Drush](#drupal--drush) - [Text Processing](#text-processing) - [Torrents](#torrents) - [PDF Tools](#pdf-tools) - [PDF Sheet Music](#pdf-sheet-music) - [Audiobooks](#audiobooks) - [Large File Transfer (rclone)](#large-file-transfer-rclone) --- ## 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 ```bash 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") ```bash 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) ```bash # 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 ```bash # Rename files matching a pattern, verbose output shows what changed rename 's/livero/lives/g' **/*.* -v ``` --- ## Torrents ### Download via magnet link (aria2c) ```bash # aria2c is a lightweight multi-protocol download utility aria2c -d ~/Downloads "magnetlink" ``` --- ## PDF Tools ### OCR a PDF (ocrmypdf) ```bash # 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) ```bash # 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) ```bash # 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. ```bash 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 ```bash pdfinfo filename.pdf ``` ### Resize to letter ```bash gs -sDEVICE=pdfwrite \ -sPAPERSIZE=letter \ -dFIXEDMEDIA \ -dPDFFitPage \ -dNOPAUSE -dBATCH \ -sOutputFile=output.pdf input.pdf ``` ### Batch resize to letter ```bash 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: ```bash 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. ```bash 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 ```bash 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 ```