BASH Shell 脚本协助,备份脚本从文件名中提取元数据并相应地移动文件

BASH Shell 脚本协助,备份脚本从文件名中提取元数据并相应地移动文件

因此,我需要编写一个 shell 脚本(我很不擅长这项技能,我认为过于线性,并将所有东西都变成管道),该脚本将连接到远程机器上的特定目录,获取所有超过 5 分钟的文件,从文件名称中提取信息(下面的编码详细信息)并根据这些信息将文件分散到相关目录中,或者如果本地备份主机上不存在目录,则创建这些目录。

在十几台机器上我有一个目录(我们称之为/Prod/Data/),里面充满了数千个名为 data-HOST-v.7.mmddyy.csv 的文件

例如:date-web2-v.7.052509.csv

需要将超过 5 分钟的文件从远程计算机拉到本地文件夹 /backup/archive/host/year/month/day/csvs

例如 /backup/archive/web2/2009/05/29/csvs

我确信我可以执行类似 ls -1 | cut -d"." -f3 的操作来提取文件的日期部分,然后使用 sed 或 awk 隔离每个部分并生成日期变量来选择将文件转储到的目录,执行类似操作来获取主机,但我不确定如何将其与要执行移动的文件相关联。不确定如何远程执行该操作,也许最好先从远程计算机 scp 过所有文件(除了任何少于 5 分钟的文件,也许可以使用 find -mmin +5 语句来找出答案?)然后在备份计算机上进行排序。

有人能指点我一个可以提供类似功能的示例脚本吗?我写的所有内容都倾向于命令 | 命令 | 命令 | 等等... 我想这项任务需要一定的维度。

感谢您的时间。

答案1

纯 Bash 解决方案,使用参数扩展。请参阅对 PE 的解释。

foo='date-web2-v.7.052509.csv'
file=${foo%*.csv}
date=${file##*.}

month=${date:0:2}
day=${date:2:2}
year=${date:4:2}

我可能会为此使用 Perl,并使用括号从正则表达式中分组捕获我想要的内容。

答案2

寻找命令具有根据文件年龄选择文件的选项。请参阅 -amin、-atime、-cmin、-ctime、-mmin 和 -mtime 选项。

您可以使用 find 来构建您需要移动的文件列表,将其存储到文件中,然后在 rsync 命令中带有 --include-from= 和 --remove-source-files 选项使用它。

答案3

为了方便将来参考,这是我提出的脚本:

#!/bin/bash
if [ $# != 1 ]
   then
      echo "usage:  slurp_vote_files.sh [user@server]"
      exit 1
fi
ssh $1 "find /Prod/Data/Votes/ -mmin +5 -type f" | while read line; do 
   vote_host=`echo $line | cut -d"_" -f3`
   vote_year=`echo $line | cut -d"." -f3 | sed 's/^..../20/'`
   vote_month=`echo $line | cut -d"." -f3 | sed 's/.\{4\}$//'`
   mkdir -p /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   scp -q $1:$line /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   ssh -n $1 "rm -f $line";
done
exit 0

它可能与原始帖子中的目标/规格不符,但它在我的特定情况下有效。

相关内容