我有多个npm项目保存在本地目录中。现在我想备份我的项目,但不包括node_modules文件夹,因为它占用了大量空间,并且可以使用npm install
随时恢复。
那么,如何使用命令行界面从指定路径递归删除所有node_modules文件夹呢?
我有多个npm项目保存在本地目录中。现在我想备份我的项目,但不包括node_modules文件夹,因为它占用了大量空间,并且可以使用npm install
随时恢复。
那么,如何使用命令行界面从指定路径递归删除所有node_modules文件夹呢?
打印出要删除的目录列表:
find . -name 'node_modules' -type d -prune
从当前工作目录中删除目录:
find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +
或者,您可以使用trash(brew install trash
)进行分阶段删除:
find . -name node_modules -type d -prune -exec trash {} +
对已有答案的改进:
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
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říkfind . -name'node_modules'-type d-prune-exec lms rm '{}' +
- Vinayak Kulkarni我已经找到了这个解决方案,
find
命令查找指定名称的文件夹。-exec rm -rf '{}' +
运行以下命令以递归删除文件夹
find /path -type d -name "node_modules" -exec rm -rf '{}' +
在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)""
以下是一个用于删除node_modules
的bash
函数。它会从当前工作目录递归地删除所有node_modules
目录,并打印找到的路径。
你只需要将其放在$PATH
中的某个位置即可。
rmnodemodules(){
find . -name 'node_modules' -type d -prune -exec echo '{}' \; -exec rm -rf {} \;
}
rm -rf node_modules **/node_modules
注意:这只是对已接受的答案进行改进,请先使用已接受的答案。
如果您很无聊,那么请继续阅读。
基本上,这个命令在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 {} \;
正如您所看到的,它由两部分组成:
find . -name 'node_modules' -type d -prune
查找所有的node_module目录-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
如果您想移动而不是删除它:
find . -name 'node_modules' -type d -prune -exec mkdir -p ./another/dir/{} \; -exec mv -i {} ./NODE_MODULES/{} \;
这将保持目录结构。
一个简单的技巧,可以删除服务器上所有的 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
,您需要重新安装它 :)
-prune
是一种重要的优化。它将导致“find”命令不会递归进入“node_module”目录(以查找嵌套的“node_modules”)。 - rzymek{}
是一个占位符,find
命令会用找到的文件路径来替换它。+
告诉find
命令将所有文件路径附加到单个命令中,而不是对每一个文件运行一次rm
命令。 - Tamlynfind . -name 'node_modules' -type d -prune -exec du -chs {} + | grep t
命令可以知道你要删除的总大小。 - Mikel