我必须在周末对来自生产服务器上两个不同路径的最近 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
做任何你想做的事情,使用该函数并剪切所需的列作为数组、循环、差异、重命名任何内容的输入