如何在 Mac 上的 Dropbox 中递归忽略 node_modules

Jus*_*hms 5 dropbox node.js npm

我想将所有节点项目保存在 Dropbox 中,但我想排除所有node_modules目录同步到 Dropbox。

我曾经通过将这些目录符号链接到不同的位置来实现这一点,但最近版本的 npm 不允许npm_modules成为符号链接,从而破坏了执行此操作的能力。

Jus*_*hms 7

以下命令将查找并添加 Dropbox 中的所有顶级 node_module 目录。也就是说,它将添加node_module目录,但不会node_module添加另一个目录内某处的目录node_modules(因为顶级目录已被忽略。

find ~/Dropbox  -type d | grep 'node_modules$' | grep -v '/node_modules/' | xargs -I {} -t -L 1 xattr -w com.dropbox.ignored 1 "{}"
Run Code Online (Sandbox Code Playgroud)

命令分解:

  • 查找所有目录~/Dropbox
  • 用于grep过滤仅以以下结尾的目录node_modules
  • 用于grep从这些还包含node_modules/** 的目录中排除
  • 用于xargs将此目录作为参数传递
  • xattr告诉 dropbox 忽略它的命令

**如果目录以node_modules但也包含结尾node_modules/,则该目录包含在更高级别的node_modules目录中,因此我们可以跳过它,因为我们已经忽略了更高级别的目录。


感谢 @shuckster 提出以下建议,消除了额外的 grep 步骤:

find-prune选项可以比两个 grep 管道更快地执行上述任务:

find ~/Dropbox -name node_modules -prune | xargs -I {} -t -L 1 xattr -w com.dropbox.ignored 1 "{}"
Run Code Online (Sandbox Code Playgroud)

完整的命令解释见这里


感谢 @shuckster 提供以下 bash 函数,该函数将在 npm 安装后自动运行

另外,我发现在我的.bashrcfor中创建一个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
}
Run Code Online (Sandbox Code Playgroud)