【问题标题】:Diff between two directories with the same file sizes but different file names文件大小相同但文件名不同的两个目录之间的差异
【发布时间】:2019-08-04 10:43:23
【问题描述】:

我有两个目录,分别是 D1 和 D2。它们都包含相同数量的大小相同但名称不同的文件。假设 D1 包含 f1、f2 和 f3,而 D2 包含 ff1、ff2 和 ff3。 在这种情况下,我想在 f1 & ff1、f2 & ff2 和 f3 & ff3 之间做一个差异。 我该怎么做?

【问题讨论】:

    标签: linux bash file directory diff


    【解决方案1】:

    假设:

    1. 对应的文件大小相同
    2. 同一目录下没有两个文件大小相同
    3. 文件名很简单(文件名中没有空格或换行等有趣的符号)

    那么你可以这样做:

    ls -1S d1/* d2/* | while read f1; read f2; do echo "diff $f1 vs $f2"; diff "$f1" "$f2"; done
    

    为什么会这样:

    • ls -1S d1/* d2/*: 这将创建一个按大小排序的d1d2 中所有文件的列表。这意味着两个连续文件大小相同的列表。
    • while read f1; read f2; do:这读取了两个条目。

    在一个简单的测试中,这给了我以下输出:

    diff d1/f3 d2/ff1
    1c1
    < 11
    ---
    > 12
    diff d1/f2 d2/ff2
    diff d1/f1 d2/ff3
    

    这里f1和ff3是空的,f2和ff2里面有1个字符相同,f3和ff1不同有2个字符。

    【讨论】:

      【解决方案2】:

      棘手。假设您肯定要区分名称不同但大小相同的文件 - 如果您在源 (D1) 和目标 (D2) 目录中有多个相同大小的文件,此解决方案将清楚地显示错误结果.

      先尝试获取两个列表:

      eval "declare -gA sizes1=( $(find D1 -printf "[%s]=%p\n") )"
      eval "declare -gA sizes2=( $(find D2 -printf "[%s]=%p\n") )"
      

      现在,遍历它们并执行您的 diff

      for item in ${!sizes1[@]} ; do 
          echo === testing ${sizes1[$item]} against ${sizes2[$item]} =====; 
          diff ${sizes1[$item]} ${sizes2[$item]}; 
      done
      

      希望对您有所帮助,并为您指明您想要的方向。

      【讨论】:

        猜你喜欢
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2012-01-20
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多