일련의 파일에 대한 차이점을 생성하는 방법은 무엇입니까?

일련의 파일에 대한 차이점을 생성하는 방법은 무엇입니까?

수천 개의 파일이 있고 모든 파일 이름이 순서대로 있으므로 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").

관련 정보