使用命令行从指定路径递归删除node_modules文件夹

328

我有多个npm项目保存在本地目录中。现在我想备份我的项目,但不包括node_modules文件夹,因为它占用了大量空间,并且可以使用npm install随时恢复。

那么,如何使用命令行界面从指定路径递归删除所有node_modules文件夹呢?

13个回答

750

打印出要删除的目录列表:

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

从当前工作目录中删除目录:

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

或者,您可以使用trashbrew install trash)进行分阶段删除:

find . -name node_modules -type d -prune -exec trash {} +

71
-prune是一种重要的优化。它将导致“find”命令不会递归进入“node_module”目录(以查找嵌套的“node_modules”)。 - rzymek
70
这就像,我很认真,这已经是我第二十次来到这个答案以复制这段代码了... xD - Cipi
15
“'{}' +” 的意思是什么? - Rokit
41
{} 是一个占位符,find 命令会用找到的文件路径来替换它。+ 告诉 find 命令将所有文件路径附加到单个命令中,而不是对每一个文件运行一次 rm 命令。 - Tamlyn
2
使用 find . -name 'node_modules' -type d -prune -exec du -chs {} + | grep t 命令可以知道你要删除的总大小。 - Mikel
显示剩余6条评论

254

12
比起之前的选项更好,因为我通常有2-3个项目需要保留node_modules文件夹。 - Black Mamba
1
这应该是顶级评论! - nkhil
11
我更喜欢彻底删除所有文件夹,需要时再重新安装它们。谁有时间手动挑选和选择呢? - fregante
2
@fregante 我。我没时间等待10个以上带有预设和后置脚本的package.json完成。这需要比思考20秒并选择10秒要长得多。 - aProgger

103

对已有答案的改进:

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

我发现上述命令获取所有文件夹并运行删除命令需要很长时间。为使命令可恢复,建议使用\;。使用-print查看正在删除的目录以了解命令的进度。

注意:您必须先cd到根目录然后再运行该命令。或者不使用find .,而是使用find {project_directory}

按顺序删除文件夹:

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

逐个删除文件夹并打印被删除的文件夹:

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

如果您喜欢交互式操作的方式,请参考jeckep的回答。在您希望修剪的目录中运行以下命令:

npx npkill

3
@Sidharth提供的回答有很好的改进,非常感谢。 - nclarx
干得好,@Sidharth。 - dipenparmar12
为了以后参考,我想删除 node_modules 的内容,但保留目录(稍后将它们添加到 Dropbox 忽略列表中)。这对我有用:find . -name 'node_modules' -type d -prune -print -exec bash -c 'rm -rf "$0"/* "$0"/..?* "$0"/.[!.]*' {} \; 通配符用于匹配隐藏文件和文件夹(以 . 开头),参见 https://unix.stackexchange.com/a/77313/486273。 - Jonáš Jančařík
改进此答案,使用 LuminS(https://github.com/wchang22/LuminS)-find . -name'node_modules'-type d-prune-exec lms rm '{}' + - Vinayak Kulkarni
哇!这真是神奇。 - codingbruh

13

我已经找到了这个解决方案,

  • 首先使用find命令查找指定名称的文件夹。
  • 执行递归删除命令 -exec rm -rf '{}' +

运行以下命令以递归删除文件夹

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


13

在Windows上,我使用以下.BAT文件从当前文件夹递归删除node_modules:

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

或通过 CMD.EXE:

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

2
最新版本:https://gist.github.com/noseratio/6961e9c4d54741e01ca705e7ff1d0c80 - noseratio - open to work

7

以下是一个用于删除node_modulesbash函数。它会从当前工作目录递归地删除所有node_modules目录,并打印找到的路径。

你只需要将其放在$PATH中的某个位置即可。

rmnodemodules(){

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

}

7
在Bash中,你可以简单地使用:
rm -rf node_modules **/node_modules

4

注意:这只是对已接受的答案进行改进,请先使用已接受的答案。

如果您很无聊,那么请继续阅读。

基本上,这个命令在99%的情况下都应该可以正常工作:

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

我注意到通过命令行删除文件比通过Finder删除文件夹要更耗时间(当从Finder删除时,它会将该文件夹移动到~/.Trash目录)。

所以如果您想将node_modules移动到~/.Trash文件夹中,您可以尝试以下命令:

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 {} \;

正如您所看到的,它由两部分组成:

  1. find . -name 'node_modules' -type d -prune 查找所有的node_module目录
  2. -exec sh -c 'mv -f "$1" "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" && mv "$(dirname "$1")/$(basename $(dirname "$1"))_$(basename "$1")" ~/.Trash/' sh {} \; 通过在其父文件夹名称前缀化来重命名node_module,并将其移动到垃圾箱

之前我使用的是:

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

运行命令后

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

请确保清空回收站 enter image description here

或者开启清空回收站功能 enter image description here


3

如果您想移动而不是删除它:

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

这将保持目录结构。


2

一个简单的技巧,可以删除服务器上所有的 node_modules 文件夹(可以减少很多空间),就是运行以下命令:

# 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 '{}' +

在这里我们需要排除/usr/lib/*,因为如果不排除它,它会删除您的npm,您需要重新安装它 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接