一連のファイルの違いを生成するには?

一連のファイルの違いを生成するには?

何千ものファイルがあり、すべてのファイル名が順番にあるので、file1.x、file2.x、file3.xなどを考えてみましょう。これらのファイルはすべて同じディレクトリにあります。

file1.xからfile2.xでdiffを生成する方法を知っていますが、あるファイルから次のファイルにdiffを生成する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

次のシェルスクリプトは、型の引数が指定されたときに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を生成する代わりに(上記のスクリプトの行diff)、連続バージョンをコミットします(例cp -- "$next" "$prefix$suffix" && git commit -m "Version $digits" -- "$prefix$suffix":)。

関連情報