過去5日間でUnixサーバー上の2つの異なる場所でファイル名は同じですが、タイムスタンプ形式が異なるファイルを比較する方法

過去5日間でUnixサーバー上の2つの異なる場所でファイル名は同じですが、タイムスタンプ形式が異なるファイルを比較する方法

週末には、本番サーバー上の2つの異なるパスの過去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

これらすべてのファイルを同じサーバー上の3番目の場所にコピーし、同じ日に作成された同じ名前のファイルをソートして比較する必要があります。

また、両方の場所は毎日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

必要に応じて関数を使用し、配列、ループ、違いへの入力で目的の列を切り取り、名前を変更します。

関連情報