如何比较过去五天内来自 Unix 服务器上两个不同位置的文件,其中文件名相同但时间戳格式不同

如何比较过去五天内来自 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 个文件,并对一周中的每一天进行比较。

我想了解最好的方法并开发一个 shell 脚本来自动执行此操作。

我是 Shell 脚本新手。

答案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

做任何你想做的事情,使用该函数并剪切所需的列作为数组、循环、差异、重命名任何内容的输入

相关内容