주말 동안 프로덕션 서버에 있는 서로 다른 두 경로의 지난 5일 동안의 파일을 비교해야 합니다.
ABC/PROD
QRS/PROD
이러한 파일의 이름은 동일하지만 다음과 같은 타임스탬프 형식이 다릅니다.
ABC/PROD/Archive
file1_20210902093041.bak
other_file_20210902104556.bak
QRS/PROD/Archive
file1_02092021094321.bak
other_file_02092021104545.bak
이 모든 파일을 동일한 서버의 세 번째 위치에 복사하고 같은 날 생성된 동일한 이름의 파일을 정렬하고 비교해야 합니다.
또한 두 위치 모두 매일 n개의 피드를 생성하지만 특정 11개의 파일만 복사하여 요일별로 비교해야 합니다.
나는 최선의 방법을 이해하고 이를 자동화하는 쉘 스크립트를 개발하고 싶습니다.
저는 쉘 스크립팅을 처음 접했습니다.
답변1
올바른 날짜 형식을 검색하는 데 문제가 있습니다. 기초부터 시작하겠습니다.
#!/bin/bash
sort_files() {
local file dirname filename date_old date_new
while read -r file
do
dirname="${file%/*}"
filename="${file##*/}"
date_old="${filename##*_}"
date_old="${date_old%.*}"
filename="${filename%_*}"
case "$date_old" in
# YYYYMMDDhhmmss
202[0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-5][0-9])
date_new="$date_old"
;;
# YYYYDDMMhhmmss
202[0-9][0-3][0-9][0-1][0-9][0-2][0-9][0-5][0-9][0-5][0-9])
date_new="${date_old:0:4}${date_old:6:2}${date_old:4:2}${date_old:8:6}"
;;
# MMDDYYYYhhmmss
[0-1][0-9][0-3][0-9]202[0-9][0-2[0-9][0-5][0-9][0-5][0-9])
date_new="${date_old:4:4}${date_old:0:2}${date_old:2:2}${date_old:8:6}"
;;
# DDMMYYYYhhmmss
[0-3][0-9][0-1][0-9]202[0-9][0-2][0-9][0-5][0-9][0-5][0-9])
date_new="${date_old:4:4}${date_old:2:2}${date_old:0:2}${date_old:8:6}"
;;
*)
continue
;;
esac
printf '%s\t%s\t%s:\t%s\n' "$filename" "${date_new:0:8}" "${dirname%%/*}" "$file"
done < <(find $dirs -iregex ".*/$searchdir/[^/]*_[0-9]+\.$suffix") | sort
return 0
}
# set global vars for find regex
dirs='ABC QRS'
searchdir=Archive
suffix=bak
# call function, output columns 2 4
sort_files | cut -f2,4
# call function, diff two files
sort_files | cut -f1,2,4 | while IFS=$'\t' read -r filename date file
do
if [ "$filename" = "$filename2" ]
then
if [ "$date" = "$date2" ]
then
diff -sq "$file2" "$file" || diff -y "$file2" "$file"
echo -e '\n'
fi
fi
filename2="$filename"
date2="$date"
file2="$file"
done
exit 0
원하는 대로 하고, 함수를 사용하고, 배열, 루프, 차이에 대한 입력으로 원하는 열을 잘라내고 이름을 바꾸세요.