지난 5일 동안 Unix 서버의 서로 다른 두 위치에서 파일 이름은 동일하지만 타임스탬프 형식이 다른 파일을 비교하는 방법

지난 5일 동안 Unix 서버의 서로 다른 두 위치에서 파일 이름은 동일하지만 타임스탬프 형식이 다른 파일을 비교하는 방법

주말 동안 프로덕션 서버에 있는 서로 다른 두 경로의 지난 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

원하는 대로 하고, 함수를 사용하고, 배열, 루프, 차이에 대한 입력으로 원하는 열을 잘라내고 이름을 바꾸세요.

관련 정보