From 70cbcc19b8ad3ceada3424838812d1079dc8da40 Mon Sep 17 00:00:00 2001 From: rdrew Date: Tue, 27 Oct 2026 12:24:11 -0300 Subject: [PATCH] [nb] Edit: cli_commands.md --- cli_commands.md | 260 ++++++++++++++++++++++++++---------------------- 1 file changed, 141 insertions(+), 119 deletions(-) diff --git a/cli_commands.md b/cli_commands.md index 19d6a00..e5ca285 100644 --- a/cli_commands.md +++ b/cli_commands.md @@ -6,6 +6,9 @@ - [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) --- @@ -15,17 +18,21 @@ ### 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' +```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") - 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 +```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 +``` --- @@ -33,25 +40,31 @@ ### Find and replace inside files (perl) - # Single file type in current directory - perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt +```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;' **/*.* +# 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 +```bash +# Rename files matching a pattern, verbose output shows what changed +rename 's/livero/lives/g' **/*.* -v +``` -## <<<<<<< HEAD +--- ## Torrents ### Download via magnet link (aria2c) - # aria2c is a lightweight multi-protocol download utility - aria2c -d ~/Downloads "magnetlink" +```bash +# aria2c is a lightweight multi-protocol download utility +aria2c -d ~/Downloads "magnetlink" +``` --- @@ -59,135 +72,144 @@ ### OCR a PDF (ocrmypdf) - # Standard: optimize output, skip pages that already have a text layer - ocrmypdf --optimize 3 --skip-text input.pdf output.pdf +```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 +# 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 +```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) - # 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 - 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 +```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 - 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 - -### Audiobook commands - - # cd to desired dir, create 'input' dir and put m4b file in it and run command - 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 +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 ``` -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 + +--- + +## PDF Sheet Music + +### Check page size + +```bash +pdfinfo filename.pdf ``` -# check current dpi +### Resize to letter -for f in _.pdf_.PDF; do -echo "=== Images in: $f ===" - pdfimages -list "$f" -echo "" -done +```bash +gs -sDEVICE=pdfwrite \ + -sPAPERSIZE=letter \ + -dFIXEDMEDIA \ + -dPDFFitPage \ + -dNOPAUSE -dBATCH \ + -sOutputFile=output.pdf input.pdf +``` -# Creates (or overwrites) images_list.txt in the current directory +### Batch resize to letter -for f in _.pdf_.PDF; do -if [ -f "$f" ]; then -echo "=== Images in: $f ===" >> images_list.txt - pdfimages -list "$f" >> images_list.txt -echo "" >> images_list.txt -fi +```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 +``` -# scan for ccitt encoding +--- -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 +## Audiobooks -# Large file transfer to gdrive +### Split an m4b into MP3 chapters (m4b-tool via Docker) -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 +`cd` to the desired directory, create an `input` dir, put the m4b file in it, then run: -# PDF sheetmusic commands +```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 +``` -## check size +### Split an m4b by chapter (ffmpeg) -`pdfinfo filename.pdf` +Reads chapter end times with ffprobe and writes `chapter_000.mp3`, `chapter_001.mp3`, etc. -## resize to letter +```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 +``` -`gs -sDEVICE=pdfwrite \ - -sPAPERSIZE=letter \ - -dFIXEDMEDIA \ - -dPDFFitPage \ - -dNOPAUSE -dBATCH \ - -sOutputFile=output.pdf input.pdf` +--- -## batch resize to letter +## Large File Transfer (rclone) -`mkdir -p resized_music -for f in *.pdf; do - gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -dNOPAUSE -dBATCH -sOutputFile="resized_music/$f" "$f" -done` +### Copy to Google Drive -> > > > > > > f99d1ed ([nb] Edit: cli_commands.md) +```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 +```