【问题标题】:How do I use bash to compare 1000 files in sequential order - 1 to 2, 2 to 3, and so on如何使用 bash 按顺序比较 1000 个文件 - 1 到 2、2 到 3 等
【发布时间】:2022-01-17 19:59:24
【问题描述】:

我在一个目录中有大约 1000 个 html 文件,它们是网页的不同版本。每个都以页面被修改的日期命名 - 例如20190104, 20190105 - 但偶尔会有差距,例如 2019010520190107 之间。

我知道如何使用 diff 将一个文件与紧随其后的版本进行比较并将差异保存到第三个文件,但我想要一个循环来处理所有 1000 个文件。标准 for i in ./* 不起作用,因为我需要在循环内引用多个文件。

我怀疑我需要将文件列表转换为数组,然后有一个引用数组元素 n 和 n+1 的 for 循环,但我遇到了语法问题。

【问题讨论】:

    标签: bash for-loop diff


    【解决方案1】:

    成对比较:

    #!/usr/bin/env sh
    
    comparePairs() {
      while [ $# -gt 1 ]
      do
        printf 'Compare %s with %s.\n' "$1" "$2"
        shift
      done
    }
    
    comparePairs foo bar baz cuux
    

    输出:

    Compare foo with bar.
    Compare bar with baz.
    Compare baz with cuux.
    

    现在你的差异对:

    #!/usr/bin/env bash
    
    diffPairs() {
      outputDir="$1"
      shift
      while [ $# -gt 1 ]
      do
        diff "$1" "$2" > "$outputDir/$1-$2.diff"
        shift
      done
    }
    
    # Use first argument as output directory
    diffPairs "$@"
    

    例子:

    ./diffPairs ~/outputdir ./*.html
    

    【讨论】:

    • while [ $# -ge 2 ]; do ...?
    • @shawn 它也可以按照您的建议进行算术比较。只要"$2" 不为空,测试[ "$2" ] 就为真。与[ -n "$2" ] 工作方式相同。
    • 如果传入一个空字符串作为参数怎么办? (当然,在处理文件名时不太可能,但在一般情况下......)使用位置参数的数量更加稳健。
    【解决方案2】:

    元素 n 和 n+1

    不,不要想未来——你不知道。你知道过去 - 遍历 n-1n

    prev=  # empty previous filename
    for cur in ./*; do
       if [[ -n "$prev" ]]; then    # if prev is Nonempty
            do_stuff "$prev" "$cur"
       fi
       prev=$cur
    done
    

    【讨论】:

    • 哦,太棒了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2014-07-06
    • 2010-12-08
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多