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