週末には、本番サーバー上の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
必要に応じて関数を使用し、配列、ループ、違いへの入力で目的の列を切り取り、名前を変更します。