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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.