我想保留我所有的节点项目保存在Dropbox中,除非我想排除所有node_modules
目录同步到Dropbox。
我曾经通过在不同的位置保持这些目录的符号链接来实现这一点,但是最近的npm版本已经破坏了这种能力,不允许npm_modules
是一个符号链接。
下面的命令将从Dropbox中查找并添加所有顶级node_module目录。也就是说,它会在另一个node_modules
目录中添加node_module
目录,而不是node_module
目录(因为顶级目录已经被忽略了)。
find ~/Dropbox -type d | grep 'node_modules$' | grep -v '/node_modules/' | xargs -I {} -t -L 1 xattr -w com.dropbox.ignored 1 "{}"
命令分解:
- 查找
~/Dropbox
中的所有目录 - 使用
grep
只过滤到以node_modules
结尾的目录 - 使用
grep
从这些目录中排除也包含node_modules/
** - 使用
xargs
将此目录作为参数传递 - 到
xattr
命令告诉dropbox忽略它
**如果目录以node_modules
结尾,但也包含node_modules/
,则该目录包含在更高级别的node_modules
目录中,因此我们可以跳过它,因为我们已经忽略了更高级别的目录。
感谢@shuckster的以下建议,消除了额外的grep步骤:
-prune
查找选项可以比两个grep管道更快地执行上述任务:
find ~/Dropbox -name node_modules -prune | xargs -I {} -t -L 1 xattr -w com.dropbox.ignored 1 "{}"
这里解释了完整的命令。
感谢@shuckster提供了以下bash函数,该函数将在npm安装后自动运行
此外,我发现在.bashrc
中为npm
创建一个函数很有帮助,该函数在安装后执行权限更新:
npm() {
case "$1" in
"install"|"i"|"ci")
command npm "$@"
if [[ $? -eq 0 && -d ./node_modules ]]; then
xattr -w com.dropbox.ignored 1 ./node_modules
echo "Added Dropbox-ignore permission to node_modules"
fi
;;
*)
command npm "$@"
;;
esac
}