【问题标题】:Using bash to automate dotfiles使用 bash 自动化点文件
【发布时间】:2011-03-08 20:35:18
【问题描述】:

我想创建自己的自动点文件文件夹。 (我将使用 git 对我的点文件使用版本控制,但这与问题无关)

我只想将~/dotfiles 中的所有文件和文件夹符号链接到我的主文件夹。对 bash 一点也不擅长,我不能这样做。请帮我解决这个问题。

如果可能的话,我也会欣赏以下功能。

  • 文件夹只是浅链接
  • 我的文件可能位于 dotfiles 文件夹中,但文件名中没有实际的点(例如 ~/dotfiles/vimrc 而不是 ~/dotfiles/.vimrc
  • 它应该可以忽略一些文件,比如我的 .git 文件,它们存储在同一个文件夹中

当然,如果您已经知道提供此功能的服务,那至少与提供一些自己动手的命令一样好。请注意我特别希望它是 bash 或所有 unix 机器上最有可能存在的东西(所以我猜使用 g++ 的命令很好)。

【问题讨论】:

  • 链接会在~/dotfiles 目录中,还是将实际的点文件移动到该目录中,并将符号链接放在原始位置?
  • 第二个。 ~/dotfiles 中的原件和~ 中的链接

标签: bash unix dotfiles


【解决方案1】:

试试这个:

ln -s ~/dotfiles/* ~

应该不需要循环。当然,如果你需要递归的话,你可以使用find

编辑:

要隐藏目标文件:

for f in ~/dotfiles/*
do
    ln -s "$f" "$HOME/.${f##*/}"
done

【讨论】:

  • 很好,它也会忽略隐藏文件(如.git):)。但是,您能否将其隐藏在主文件夹中的文件(以. 开头)。例如,它应该将~/dotfiles/vimrc 链接到~/.vimrc。那可能吗?如果是,你会得到正确的答案。 :)
  • 谢谢!鉴于您提供给我的知识,我创建了自己的 github 存储库,该存储库执行上述操作以及备份。随意尝试一下! :) link
【解决方案2】:

我不确定我的问题是否正确,但如果您正在寻找 dir-content 的符号链接,请尝试

for f in `ls -1 .dotfiles`
do
   ln -s .dotfiles/$f ~/$f
done

也许这已经成功了

【讨论】:

  • 我让它工作得很好。只有我希望能够忽略文件。有类似if $f == '.git' then continue 的东西吗?最好我会写一个被忽略的文件和文件夹的列表。谢谢
  • ls 完全没有必要:for f in .dotfiles/*(然后是ln -s "$f" "$HOME/$f")。此外,您需要在用户名前加上 @ 前缀,以便他们自动收到回复通知。 @Tarrasch:if [[ $f = '.git' ]]; then continue; fi[[ $f = '.git' ]] && continue
【解决方案3】:

为了管理点文件,我非常喜欢 Zach Holman 的方法。我用我的点文件做了同样的事情,你可以在这里找到它:)

https://github.com/rhacker/dotFiles

【讨论】:

  • 我不喜欢这个解决方案的地方在于它依赖于安装的 ruby​​。另一方面,由于难以记住语法,我不喜欢用 bash 编码。因此,取决于 ruby​​(或其他脚本语言)做出合理的权衡。
  • @Tarrasch 如果您正在使用 ruby​​,这没有问题。否则,这取决于您的需要:) 此外,ruby 中还有一些其他很酷的工具。所以这将是安装 ruby​​ 的好方法:)
【解决方案4】:

也许你正在寻找一个点文件管理器,我会建议你检查DFM(点文件管理器)。 DFM 以非常简洁的方式解决了您遇到的问题:

【讨论】:

    【解决方案5】:

    Atlassian 在using a git work tree instead of symlinks 上有一个教程。该方法使用:

    1. 侧文件夹中的裸 git 存储库(例如 $HOME/.cfg$HOME/dotfiles),以及
    2. config bash 别名,用于执行管理配置文件的 git 命令。

    例如,您可以运行config status 来检查哪些文件已被修改,config checkout 可以获取存储库中的文件,config commit 可以更新存储库。它只需要gitbash

    【讨论】:

      【解决方案6】:

      我也在寻找一种以最少步骤设置新机器的方法,在花了一些时间后,我发现几乎所有的开发人员都使用 git 来存储和共享这些文件和符号链接来同步它们。

      好吧,符号链接有效,但它不是将本地文件同步到 git 存储库的最佳方式。有一个更好的解决方案,由 Atlassian 的人员编写 - https://www.atlassian.com/git/tutorials/dotfiles

      因此,使用 git bare 存储库是将文件与远程副本同步的最佳和最优雅的方式,创建一个 bash 脚本来自动安装和设置。

      管理点文件

      管理这些点文件的诀窍是创建一个裸 git 存储库。如果您从头开始并且之前没有跟踪您的点文件,请在 $HOME 目录中创建一个裸存储库。

      git init --bare $HOME/.dotfiles
      

      为了更容易使用,我们将其命名为 dotfiles,我们将使用它代替常规 git 与我们的 dotfiles 存储库进行交互。

      alias dotfiles="/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME"
      

      现在我们可以使用 dotfiles 命令跟踪我们的点文件了,其中一些示例如下:

      # to check the version history 
      dotfiles log
      
      # to check the status of the tracked and untracked files 
      dotfiles status
      
      # to add a file for tracking
      dotfiles commit .vimrc -m ".vimrc added"
      
      # push new files or changes to the github
      dotfiles push origin main
      

      点文件的用例和优点

      这种管理和共享的方法有很多优点,下面列出了其中一些。

      轻松设置

      设置新机器可能是一项耗时的任务,但通过这种方法,我们可以在一分钟内使用我们的个性化配置。我们只需要克隆存储库并获取 .bashrc 或 .zshrc 文件。

      git clone --bare https://github.com/<username>/dotfiles.git $HOME/.dotfiles && source ~/.zshrc
      

      版本化的点文件

      最适合尝试新配置并保留更改历史记录(基本上所有使用 git 的优点)

      # to check the version history 
      dotfiles log
      

      在多个设备上共享

      使用分支共享多个设备的相同配置,更改最少,为您的新机器创建一个分支,例如:-

      # Create configurations specific to your aws machines
      dotfiles checkout -b aws
      

      点文件的配置文件

      使用分支根据您的环境创建配置,创建一个分支并根据您的工作环境进行配置。

      # Manage multiple profiles - check out to the work profile 
      dotfiles checkout work
      

      我也使用这种方式来同步和存储我的点文件see my dotfiles repository,并且可以在Storing dotfiles with Git 阅读我写的关于管理多个设备的文章。

      【讨论】:

        猜你喜欢
        • 2016-12-17
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多