.gitignore | ||
aax2mp3 | ||
bates | ||
camel | ||
cf | ||
checknode | ||
comfy | ||
ddns | ||
delpycache | ||
emoji_flag | ||
get | ||
gitpurge | ||
gitscan | ||
import_finder | ||
ip | ||
kip | ||
linecount | ||
lsd | ||
mamba_exporter | ||
mamba_importer | ||
murder | ||
nocomment | ||
noon | ||
nv | ||
ocr | ||
ollapull | ||
pf | ||
pippin | ||
pull | ||
push | ||
README.md | ||
serv | ||
sij | ||
tablemd | ||
tmux_merge | ||
txt_line_merge_abc | ||
txtsort | ||
uninstall | ||
vitals | ||
vpn | ||
z |
PATH-worthy Scripts 🛠️
A collection of various scripts I use frequently enough to justify keeping them in my system PATH.
I haven't written documentation for all of these scripts. I might in time. Find documentation for some of the highlights below.
Installation
- Clone and enter repository:
git clone https://sij.ai/sij/pathScripts.git
cd pathScripts
- Add to your system PATH:
macOS / ZSH:
echo "export PATH=\"\$PATH:$PWD\"" >> ~/.zshrc
source ~/.zshrc
Linux / Bash:
echo "export PATH=\"\$PATH:$PWD\"" >> ~/.bashrc
source ~/.bashrc
- Make scripts executable:
chmod +x *
📄 bates
- PDF Bates Number Tool
Extracts and renames PDFs based on Bates numbers.
Setup
pip3 install pdfplumber
# For OCR support:
pip3 install pytesseract pdf2image
brew install tesseract poppler # macOS
# or
sudo apt-get install tesseract-ocr poppler-utils # Debian
Usage
bates /path/to/folder --prefix "FWS-" --digits 6 --name-prefix "FWS "
Key Features
- Extracts Bates numbers from text/scanned PDFs
- Renames files with number ranges
- Prepare files for use with my Bates Source Link DEVONthink script
- Preserves original names in Finder comments
- OCR support for scanned documents
- Dry-run mode with
--dry-run
Options
--prefix
: The Bates number prefix to search for (default: "FWS-")--digits
: Number of digits after the prefix (default: 6)--ocr
: Enable OCR for scanned documents--dry-run
: Test extraction without renaming files--name-prefix
: Prefix to use when renaming files--log
: Set logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
Examples
# Test without making changes
bates /path/to/pdfs --prefix "FWS-" --digits 6 --dry-run
# Rename files with OCR support
bates /path/to/pdfs --prefix "FWS-" --digits 6 --name-prefix "FWS " --ocr
Notes
- Always test with
--dry-run
first - Original filenames are preserved in Finder comments (macOS only)
- OCR is disabled by default to keep things fast
🐪 camel
- File Renaming Utility
Renames files in the current directory by splitting camelCase, PascalCase, and other compound words into readable, spaced formats.
Features
- Smart Splitting:
- Handles camelCase, PascalCase, underscores (
_
), hyphens (-
), and spaces. - Preserves file extensions.
- Splits on capital letters and numbers intelligently.
- Handles camelCase, PascalCase, underscores (
- Word Detection:
- Uses NLTK’s English word corpus and WordNet to identify valid words.
- Common words like "and", "the", "of" are always treated as valid.
- Automatic Renaming:
- Processes all files in the current directory (ignores hidden files).
- Renames files in-place with clear logging.
Setup
- Install dependencies:
pip3 install nltk
- Download NLTK data:
python3 -m nltk.downloader words wordnet
Usage
Run the script in the directory containing the files you want to rename:
camel
Examples
Before running the script:
Anti-OedipusCapitalismandSchizophrenia_ep7.aax
TheDawnofEverythingANewHistoryofHumanity_ep7.aax
TheWeirdandtheEerie_ep7.aax
After running the script:
Anti Oedipus Capitalism and Schizophrenia ep 7.aax
The Dawn of Everything A New History of Humanity ep 7.aax
The Weird and the Eerie ep 7.aax
Notes
- Hidden files (starting with
.
) are skipped. - If a word isn’t found in the dictionary, it’s left unchanged.
- File extensions are preserved during renaming.
📦 kip
- Intelligent Python Package Installer
A smart package installer that automates Python dependency management, supporting both mamba and pip.
Setup
chmod +x kip
Usage
kip <package1> [<package2> ...] # Install specific packages
kip <script.py> # Install from Python file
kip -r <requirements.txt> # Install from requirements file
Key Features
- Smart import detection in Python files
- Handles package name corrections automatically
- Uses mamba first, falls back to pip
- Supports multiple installation methods
- Filters out built-in modules
Examples
# Install single package
kip requests
# Analyze script and install dependencies
kip analysis.py
# Install from requirements
kip -r requirements.txt
Package Corrections
Automatically corrects common package names:
yaml
→pyyaml
dateutil
→python-dateutil
dotenv
→python-dotenv
newspaper
→newspaper3k
Notes
- Requires Python 3.x
- Works with mamba or pip
- Provides clear installation feedback
- Ignores built-in modules and generic names
📏 linecount
- Line Counting Tool for Text Files
Recursively counts the total lines in all text files within the current directory, with optional filtering by file extensions.
Usage
linecount [<extension1> <extension2> ...]
Examples
linecount # Count lines in all non-binary files
linecount .py .sh # Count lines only in .py and .sh files
Key Features
- Recursive Search: Processes files in the current directory and all subdirectories.
- Binary File Detection: Automatically skips binary files.
- File Extension Filtering: Optionally count lines in specific file types (case-insensitive).
- Quick Stats: Displays the number of files scanned and total lines.
Notes
- If no extensions are provided, all non-binary files are counted.
- Use absolute or relative paths when running the script in custom environments.
Here’s the updated and refined documentation for the push
and pull
scripts:
🔄 push
& pull
- Bulk Git Repository Management
Scripts to automate updates and management of multiple Git repositories.
Setup
-
Create a Repository List
Add repository paths to~/.repos.txt
, one per line:~/sijapi ~/workshop/Nova/Themes/Neonva/neonva.novaextension ~/scripts/pathScripts ~/scripts/Swiftbar
- Use
~
for home directory paths or replace it with absolute paths. - Empty lines and lines starting with
#
are ignored.
- Use
-
Make Scripts Executable
chmod +x push pull
-
Run the Scripts
pull # Pulls the latest changes from all repositories push # Pulls, stages, commits, and pushes local changes
Features
pull
- Recursively pulls the latest changes from all repositories listed in
~/.repos.txt
. - Automatically expands
~
to the home directory. - Skips directories that do not exist or are not Git repositories.
- Uses
git pull --force
to ensure synchronization.
push
- Pulls the latest changes from the current branch.
- Stages and commits all local changes with an auto-generated message:
Auto-update: <timestamp>
. - Pushes updates to the current branch.
- Configures the
origin
remote automatically if missing, using a URL based on the directory name.
Notes
- Both scripts assume
~/.repos.txt
is the repository list file. You can update theREPOS_FILE
variable if needed. - Use absolute paths or ensure
~
is correctly expanded to avoid issues. - The scripts skip non-existent directories and invalid Git repositories.
push
will attempt to set theorigin
remote automatically if it is missing.
🌐 vitals
- System and VPN Diagnostics
The vitals
script provides detailed system diagnostics, VPN status, DNS configuration, and uptime in JSON format. It integrates with tools like AdGuard Home, NextDNS, and Tailscale for network monitoring.
Usage
-
Set up a DNS rewrite rule in AdGuard Home:
- Assign the domain
check.adguard.test
to your Tailscale IP or any custom domain. - Update the
adguard_test_domain
variable in the script if using a different domain.
- Assign the domain
-
Run the script:
vitals
Example output (JSON):
{ "local_ip": "192.168.1.2", "wan_connected": true, "wan_ip": "185.213.155.74", "has_tailscale": true, "tailscale_ip": "100.100.100.1", "mullvad_exitnode": true, "mullvad_hostname": "de-ber-wg-001.mullvad.ts.net", "nextdns_connected": true, "nextdns_protocol": "DoH", "adguard_connected": true, "uptime": "up 3 days, 2 hours, 15 minutes" }
🔒 vpn
- Tailscale Exit Node Manager
Privacy-focused Tailscale exit node management with automated logging.
Setup
pip3 install requests
Usage
vpn <action> [<country>] # Actions: start, stop, new, shh, to, status
Actions
start
: Connect to a suggested exit node if not already connected.stop
: Disconnect from the current exit node.new
: Switch to a new suggested exit node.shh
: Connect to a random exit node in a privacy-friendly country.to <country>
: Connect to a random exit node in a specific country.status
: Display the current exit node, external IP, and connection duration.
Features
- Privacy-Friendly Quick Selection: Supports random exit nodes from:
Finland
,Germany
,Iceland
,Netherlands
,Norway
,Sweden
,Switzerland
. - Connection Verification: Ensures exit node and IP via Mullvad API.
- Automated Logging: Tracks all connections, disconnections, and IP changes in
/var/log/vpn_rotation.txt
. - Default Tailscale arguments:
--exit-node-allow-lan-access
--accept-dns
--accept-routes
Examples
vpn start # Connect to a suggested node.
vpn shh # Connect to a random privacy-friendly node.
vpn to Germany # Connect to a random exit node in Germany.
vpn status # Show current connection details.
vpn stop # Disconnect from the exit node.
Notes
- Requires active Tailscale configuration and internet access.
- Logging is handled automatically in
/var/log/vpn_rotation.txt
. - Use
sudo
for actions requiring elevated permissions (e.g.,crontab
).
More scripts will be documented as they're updated. Most scripts include --help
for basic usage information.