388

I have multiple npm projects saved in a local directory. Now I want to take backup of my projects without the node_modules folder, as it is taking a lot of space and can also be retrieved any time using npm install.

So, what would be a solution to delete all node_modules folders recursively from a specified path using the command line interface?

15 Answers 15

869

Print out a list of directories to be deleted:

find . -name 'node_modules' -type d -prune 

Delete directories from the current working directory:

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + 

Alternatively you can use trash (brew install trash) for staged deletion:

find . -name node_modules -type d -prune -exec trash {} + 
Sign up to request clarification or add additional context in comments.

12 Comments

-prune is an important optimization. It'll case find not to recurse into node_module directories (to look for nested node_modules)
For a project, I get /node_modules/gulp-server-livereload/node_modules: Directory not empty in a lot of "inner" node_modules folders. How to workaround this?
This is like, I'm serious, the 20th time I am at this answer to copy this code... xD
What is the meaning of '{}' +?
{} is a placeholder which find replaces with the file path it found. + tells find to append all the file paths to a single command rather than running rm for each.
|
359

Try npkill tool.

npx npkill 

It will find all node_modules and let you remove them selectively.

npkill

5 Comments

A better option than above since I usually have 2-3 projects which I want to keep node_modules intact
This should be the top comment!
I prefer to nuke all folders and reinstall them again as needed. Who has time to pick and choose manually?
@fregante Me. I dont have the time to wait for 10+ package.jsons with pre and postscripts to finish. This takes a lot longer than to think 20s and choose 10s.
this is solid - was quick and with simple projects u just hit space right away and node_modules is sent to valhalla
122

Improving on the accepted answer:

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + 

I found that the command above would run a very long time to fetch all folders and then run a delete command. To make the command resumable, I'd suggest using \;. To see progress of the command being run, use -print to see the directory being deleted.

Note: You must first cd into the root directory and then run the command. Or instead of find ., use find {project_directory}.

To delete folders one by one:

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' \; 

To delete folders one by one and print the folder being deleted:

find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \; 

For the people who like an interactive way of doing this, refer to jeckep's answer. Run this in the directory you wish to prune:

npx npkill 

5 Comments

Nice improvements on the accepted answer @Sidharth, much appreciated
Good job @Sidharth
For (my own) future reference - I wanted to remove the contents of node_modules but leaving the directories in place (to add them to a Dropbox ignore list later). This works for me: find . -name 'node_modules' -type d -prune -print -exec bash -c 'rm -rf "$0"/* "$0"/..?* "$0"/.[!.]*' {} \; The wildcards are for matching hidden files and folders (starting with .) as per unix.stackexchange.com/a/77313/486273
Improving on this answer, using luminS ( github.com/wchang22/LuminS ) – find . -name 'node_modules' -type d -prune -exec lms rm '{}' +
bruh! this does wonders
16

When on Windows, I use the following .BAT file to delete node_modules recursively from the current folder:

@for /d /r . %d in (node_modules) do @if exist %d (echo %d && rd %d /s /q) 

Or, via CMD.EXE:

>cmd.exe /c "@for /d /r . %d in (node_modules) do @if exist %d (echo "%d" && rd "%d" /s /q)"" 

1 Comment

15

In Bash, you can simply use

rm -rf node_modules **/node_modules 

Comments

14

I have come across with this solution,

  • first find the folder using find and specify name of the folder.
  • execute delete command recursively -exec rm -rf '{}' +

run the following command to delete folders recursively

find /path -type d -name "node_modules" -exec rm -rf '{}' +

Comments

7

bash function to remove node_modules. It will remove all node_modules directories recursively from the current working directory, while printing found paths.

You just need to put in somewhere in your $PATH

rmnodemodules(){ find . -name 'node_modules' -type d -prune -exec echo '{}' \; -exec rm -rf {} \; } 

Comments

7

Note: This is just improving on the accepted answer, please use the accepted answer first.

If you are so bored then keep reading.

Basically, this command should work fine for 99% of cases

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +

I notice that deleting files via the command line is longer than deleting a folder via Finder (when deleting from Finder it moves that folder to ~/.Trash directory).

So if you want to move node_modules to ~/.Trash folder then you can try

find . -name 'node_modules' -type d -prune -exec sh -c 'mv -f "$1" "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" && mv "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" ~/.Trash/' sh {} \;

as you notice it consist of 2 parts.

  1. find . -name 'node_modules' -type d -prune find all node_module dirs
  2. -exec sh -c 'mv -f "$1" "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" && mv "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" ~/.Trash/' sh {} \; rename node_module by prefixing it with it's parent folder name and move it to Trash

Before I had

~/Development/angular-projects ┣ project1 ┣ project2 ┗ project3 

After running command

~/.Trash ┣ ~project1_node_modules ┣ ~project2_node_modules ┗ ~project3_node_modules 

Then make sure to empty trash enter image description here

Or Turn On empty trash feature enter image description here

Comments

3

If you want to move instead of delete it:

find . -name 'node_modules' -type d -prune -exec mkdir -p ./another/dir/{} \; -exec mv -i {} ./NODE_MODULES/{} \; 

This will keep the directory structure.

Comments

3

Quite late to the party, but doesn't this remove all node_modules recursively (on Linux and MacOS at least)?

rm -rf node_modules */node_modules */*/node_modules 

2 Comments

It did not work
Try rm -rf node_modules */node_modules **/node_modules
2

A simple trick to remove all node_modules folders in your servers (which can reduce a lot of space) is to run:

# For Ubuntu sudo find / -not -path "/usr/lib/*" -name 'node_modules' -type d -prune -exec rm -rf '{}' + # For macOS sudo find / -not -path "/usr/local/*" -name 'node_modules' -type d -prune -exec rm -rf '{}' + 

Here we need to exclude /usr/lib/* because if you won’t, it will delete your npm and you need to reinstall it :)

Comments

1

I wrote a tool in Rust for this with support for Windows, MacOS and Linux called rrm - GitHub

cd $HOME/Development rrm -f node_modules . 

Outputs

Looking within: /home/alshdavid/Development Looking for: node_modules Found: /home/alshdavid/Development/my-project-a/node_modules /home/alshdavid/Development/my-project-b/node_modules /home/alshdavid/Development/my-project-c/node_modules Delete matches? [y/N] 

I wrote this because I wanted to use the same command line syntax on all platforms because I use Windows, MacOS and Linux.

It's a 200kb binary that does the trick

Comments

0

Python Script to Delete the node_modules folder from multiple projects. Just place it in your project folder consisting multiple projects and run it.

import os import shutil dirname = '/root/Desktop/proj' #Your Full Path of Projects Folder dirfiles = os.listdir(dirname) fullpaths = map(lambda name: os.path.join(dirname, name), dirfiles) dirs = [] for file in fullpaths: if os.path.isdir(file): dirs.append(file) for i in dirs: dirfiles1 = os.listdir(i) fullpaths1 = map(lambda name: os.path.join(i, name), dirfiles1) dirs1 = [] for file in fullpaths1: if os.path.isdir(file): dirs1.append(file) if(file[-12:]=='node_modules'): shutil.rmtree(file) print(file) 

1 Comment

seems a bit overkill for something that can be done in one line from basic linux programs and probably even windows
0

To expand on the previous answers: Here is a script that automatically deletes all */node_modules and */dist folders to clean out any installed libraries.

#!/bin/bash # Script to clean all: # - */node_modules # - */dist scriptDir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) cd "$scriptDir" echo "Removing node_modules..." args=( . \( -name 'dist' -o -name 'node_modules' \) # find all folders with name dist or node_modules -prune # exclude recursive search in subdirectories -print # output results -exec rm -rf '{}' + # delete all folders ) find "${args[@]}" echo "Done." 

1 Comment

Not really an improvement from the decade old answers that were already given. Please, when answering old questions, be sure to bring something really new; for example some new ways of doing that did not exist back in the time.
0

The cross-platform solution with pnpm:

$ pnpm --recursive exec pnpm dlx rimraf node_modules && pnpm dlx rimraf node_modules 

Personally, I like to add it as a clean:modules task in monorepos root package.json:

"scripts": { "clean:modules": "pnpm --recursive exec pnpm dlx rimraf node_modules && pnpm dlx rimraf node_modules", … } 

Then you only have to remember pnpm clean:modules :)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.