如何为一系列文件生成差异?

如何为一系列文件生成差异?

我有一系列数千个文件,所有文件名均按顺序排列,所以假设 file1.x、file2.x、file3.x 等。所有这些文件都位于同一目录中。

我知道如何生成从 file1.x 到 file2.x 的差异,但是有没有一种方法可以编写 bash 脚本来生成从一个文件到下一个文件的差异?基本上,它会首先从 1 到 2,然后从 2 到 3,然后从 3 到 4,等等,直到完成。

答案1

以下脚本采用类似的参数"file*.x"并将其应用于find | sort以获取要处理的文件列表。对于数千个文件,您可能会得到“太多参数” echo file*.x

#!/bin/bash

prev=
find . -maxdepth 1 -type f -name "$1" | sort -V |
while read -r file; do
        file=${file#*/} # Remove leading ./
        if test -n "$prev"; then
                diff -u "$prev" "$file" > "${prev%.*}-${file%.*}.diff"
        fi
        prev="$file"
done

会话示例:

$ echo a > file1.x
$ echo b > file2.x
$ echo c > file3.x
$ echo d > file5.x
$ echo e > file10.x
$ ./script.sh "file*.x"
$ ls *.diff
file1-file2.diff  file2-file3.diff  file3-file5.diff  file5-file10.diff

答案2

以下 shell 脚本在给出 形式的参数时file1.x,会生成一系列差异。它会递增文件名中的最后一系列数字(因此您可以从file0.x或开始file42.x)并继续下去,直到找到丢失的数字。

#!/bin/sh
current=$1
suffix=${1##*[0-9]}; digits=${1%"$suffix"}
digits=${digits##*[!0-9]}; prefix=${1%"$digits$suffix"}
while
  leading_zeros=${digits%%[1-9]*}; digits=${digits#$leading_zeros}
  case $digits in
    *[!9]*) digits=$leading_zeros$((digits+1));;
    *) digits=${leading_zeros%0}$((digits+1));;
  esac
  next=$prefix$digits$suffix
  [ -e "$next" ]
do
  diff -u -- "$current" "$next" >"$next.diff"
  current=$next
done

与其生成一堆差异,不如将版本输入到版本控制中,并使用漂亮的 VC 工具来探索连续的修订版本可能更方便。为此,初始化版本控制(例如git init),添加初始文件(例如cp file1.x file.x && git add file.x && git commit -m "version 1"),而不是生成差异(diff上面脚本中的行)提交连续版本(例如cp -- "$next" "$prefix$suffix" && git commit -m "Version $digits" -- "$prefix$suffix")。

相关内容