If you're like me, you have a GitHub
directory in your Documents
folder with tens or possibly hundreds of repos that use the Node Package Manager. Also, if you're like me, you tend to work on several projects simultaneously. And, once again, if you're like me, you tend to forget about the node_modules
directory when you're either done working on the project, or don't plan to for quite some time.
If this sounds like you, then this script is for you! It's written in bash
, which you can run on Linux or Mac, but to run it on Windows, you'll want to go ahead and download the Cmder (link at bottom) console emulator, which gives you all the GNU tools we know and love, like ls
, nano
, rm
, find
, and, of course sh
.
Alright, here's the code:
#!/bin/bash # Initialize dry-run flag to false DRY_RUN=false # Initialize exclusion file to empty EXCLUDE_FILE="" trim_string() { echo "$1" | awk '{$1=$1};1' } # Manually parse command-line options while [ "$#" -gt 0 ]; do case "$1" in -d) DRY_RUN=true shift ;; -e) EXCLUDE_FILE="$2" shift 2 ;; *) # Assume the remaining argument is the parent directory PARENT_DIR="$1" shift ;; esac done # Check if the parent directory is provided if [ -z "$PARENT_DIR" ]; then echo "Usage: $0 [-d] [-e exclude_file] <parent_directory>" exit 1 fi # Read the exclusion list into an array EXCLUDE_DIRS=() if [ -n "$EXCLUDE_FILE" ]; then echo "Reading exclusion list from $EXCLUDE_FILE" while read -r exclude; do echo "Excluding: $exclude" EXCLUDE_DIRS+=("$exclude") done <"$EXCLUDE_FILE" fi # Loop through each subdirectory in the parent directory for directory in "$PARENT_DIR"/*; do # Skip if not a directory if [ ! -d "$directory" ]; then continue fi # Get the name of the subdirectory subdir_name=$(basename "$directory") trimmed_subdir_name=$(trim_string "$subdir_name") echo "Current subdir: $subdir_name" skip=false # Check if the subdirectory is in the exclusion list for exclude in "${EXCLUDE_DIRS[@]}"; do trimmed_exclude=$(trim_string "$exclude") if [ "$trimmed_subdir_name" = "$trimmed_exclude" ]; then skip=true break fi done if [ "$skip" = true ]; then echo "Skipping excluded directory: $subdir_name" else echo "Processing directory: $directory" # Delete or print node_modules if [ -d "$directory/node_modules" ]; then if [ "$DRY_RUN" = true ]; then echo "[Dry Run] Would delete node_modules in $directory" else echo "Deleting node_modules in $directory" rm -rf "$directory/node_modules" fi else echo "node_modules does not exist in $directory" fi # Delete or print package-lock.json if [ -f "$directory/package-lock.json" ]; then if [ "$DRY_RUN" = true ]; then echo "[Dry Run] Would delete package-lock.json in $directory" else echo "Deleting package-lock.json in $directory" rm -f "$directory/package-lock.json" fi else echo "package-lock.json does not exist in $directory" fi # Delete or print yarn.lock if [ -f "$directory/yarn.lock" ]; then if [ "$DRY_RUN" = true ]; then echo "[Dry Run] Would delete yarn.lock in $directory" else echo "Deleting yarn.lock in $directory" rm -f "$directory/yarn.lock" fi else echo "yarn.lock does not exist in $directory" fi # Delete or print pnpm-lock.yaml if [ -f "$directory/pnpm-lock.yaml" ]; then if [ "$DRY_RUN" = true ]; then echo "[Dry Run] Would delete pnpm-lock.yaml in $directory" else echo "Deleting pnpm-lock.yaml in $directory" rm -f "$directory/pnpm-lock.yaml" fi else echo "pnpm-lock.yaml does not exist in $directory" fi fi done echo "Done!"
Here's how you can call the script. Open up Cmder and type:
sh C:\path\to\your\script.sh -d
The -d
flag does a dry run, so you can see how it's going to effect your directories before you willy-nilly start deleting directories.
There is also a -e
option to supply a file with a list of excluded directories. You don't need the full directory path in the list, just the relative pathname. So, for example, if you were running the script on C:\github
and you want to skip C:\github\project1
and C:\github\project2
, you would create an exclude.txt
file with the following:
project1 project2
Then you run the command:
sh C:\path\to\your\script.sh -e C:\path\to\exclude.txt
That's it! Hope you enjoy. I know your backup software will be really happy with you! 🤣🙃
Resources
- Cmder Console Emulator
- How to Get a Unix-Like Terminal Environment in Windows and Visual Studio Code
Thank You!
Thank you for taking the time to read my article and I hope you found it useful (or at the very least, mildly entertaining). For more great information about web dev, systems administration and cloud computing, please read the Designly Blog. Also, please leave your comments! I love to hear thoughts from my readers.
If you want to support me, please follow me on Spotify!
Current Projects
- Snoozle.io- An AI app that generates bedtime stories for kids ❤️
- react-poptart - A React Notification / Alerts Library (under 20kB)
- Spectravert - A cross-platform video converter (ffmpeg GUI)
- Smartname.app - An AI name generator for a variety of purposes
Looking for a web developer? I'm available for hire! To inquire, please fill out a contact form.
Top comments (2)
Dude - This is actually genius.
Everyone up vote this post
We must get everyone to see this
Haha thanks. I appreciate your kind feedback! :D