【问题标题】:Bash: Symlink FollowingBash:符号链接关注
【发布时间】:2011-08-04 18:11:39
【问题描述】:

我有一个文件树,其中包含我生成的一堆数据。我决定在数据生成的几个阶段,我想在使用的程序中尝试一些不同的配置选项。

我的解决方案是复制数据树,并将符号链接到所有原始数据(乘以我正在运行的新测试的数量)。然后我会让程序根据需要破坏符号链接。结果将是未受我的新配置影响的数据的原始树的符号链接,以及任何新配置的真实数据。

问题是我使用的大多数程序上的-clobber 选项都遵循符号链接,因此它实际上破坏了我的原始数据。有什么我可以尝试的(可能是 bash 环境设置之类的?)可能会使所有这些程序破坏实际的符号链接,而不是它指向的数据?

【问题讨论】:

    标签: bash filesystems symlink overwrite data-analysis


    【解决方案1】:

    这可能是不可能的 - 该选项可能通过简单地以“截断”模式打开文件来工作 - 要替换​​符号链接,它实际上必须事先使用单独的函数删除文件 [符号链接]。您可以尝试将原始数据文件的权限 (chmod -w) 设置为不允许写入,但这可能会使其无法正常工作

    【讨论】:

      【解决方案2】:

      程序是否在写入前检查新输出是否与旧输出相同?如果不是,那么符号链接似乎不会提供任何优势,因为数据存储在运行分析过程中始终是唯一的。

      你能改变程序编写输出的方式吗?以下顺序将避免遵循符号链接:

      1. 将新输出写入out.tmp
      2. 如果旧输出out和out.tmp相同,删除out.tmp
      3. 否则,将out.tmp 移动到out 之上

      数据有多大?它是否足够大以至于值得努力优化存储需求?您始终可以保存完整的输出,并在事后运行一些分析(在最简单的情况下,diff)以查看数据是否相同。

      如果是许多 GB 的数据,您可能需要寻找一个文件系统来为您优化重复数据(该功能称为“重复数据删除”)。或者,您可以使用LVM's snapshot support,它允许廉价的文件系统写入时复制快照。

      作为穷人的去重文件系统,你可以在bash中做这样的事情:

      for file in $output_files; do
          md5=`md5sum $file | awk '{print $1}'`
          if [ ! -f "db/$md5" ]; then
              mv $file db/$md5
          fi
          ln -sf db/$md5 $file
      done
      

      【讨论】:

      • 是的,主树有几百 GB,所以我不能真正复制。我根本无法控制这些程序。我的临时解决方案是通过一个包装器运行所有内容,该包装器在运行之前删除输出文件,就像你建议的那样。我真的需要一种很好的方法来欺骗程序认为链接是常规文件。
      • @ajwood 你只是想在某些时候欺骗程序,但是......如果数据没有改变,某些东西需要具有不写入数据的新副本的智能。我在答案中添加了一种快速而肮脏的重复数据删除方法,适用于有许多完全未更改的输出文件的情况。
      • 我得到的设置是我可以控制执行开始的位置——我不需要担心在运行开始附近的东西重复。我做需要的是最终运行的程序,它们破坏simlinks而不是破坏simlinks的目标。恐怕我的问题没有真正好的答案。
      猜你喜欢
      • 1970-01-01
      • 2016-03-17
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多