所以我需要build立一个shell脚本(我的一个技巧是垃圾,我认为是线性的,把所有东西都当成pipe道)连接到一个远程机器到一个特定的目录,淹没所有超过5分钟的文件,该文件的名称(下面的编码细节),然后将文件分散到相关的目录中,或者在本地备份主机上不存在的情况下创build目录。
在十几台机器上,我有目录(让我们称之为/ 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 | 切“-d”。 -f3提取文件的date部分,然后使用sed或awk来隔离每个部分并生成datevariables以select将文件转储到哪些目录中,做类似于抓取主机的东西,但是我不知道如何去做与那个在其上执行的文件关联。 不知道如何远程执行,也许最好先从远程机器上抓取所有文件(less于5分钟的任何文件,也许可以用find -mmin +5语句来解决这个问题)?然后在备份机器上的所有内容进行sorting。
有人会这样友好地指示我可以提供类似function的示例脚本的方向吗? 我写的一切都是命令| 命令| 命令| 等等…我想这个任务将需要一些维度。
感谢您的时间。
纯Bash解决scheme,使用参数扩展。 看到这个 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,并使用圆括号从正则expression式中捕获我想要的组。
find命令可以select根据年龄select文件。 请参阅-amin,-atime,-cmin,-ctime,-mmin和-mtime选项。
您可以使用find来创build需要移动的文件列表,将其存储到一个文件中,然后在带有–include-from =和–remove-source-files选项的rsync命令中使用。
为了将来的参考,这是我想出的脚本:
#!/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
它可能不符合原来的文章中的目标/规格,但它适用于我的具体情况。