我正在使用rsync
将我们的卫星服务器中的照片复制到主服务器中。因此,执行此操作的脚本基本上是从PC连接到PC并执行rsync
。
我一直在尝试使用find来确定xy天以下的文件(这将是几天,但数量会有所不同)。用--files-from=<()
指定文件但是命令find /var/dav/davserver/ -mtime -3 -type f -exec basename {} \;
在某些机器上非常慢,甚至使rsync超时。它们也是服务器,因此每隔几分钟运行一次这个命令会花费太多的处理器能力而我不想带走它。
第二个方法是在/var/dav/davserver/year/month/day/
目录下利用我们存储这些文件的方式。然而,当我开始研究它时,我意识到我需要编写相当多的代码来处理几个月和几年的结束,甚至更多的天数没有固定(它可以超过31天,因此这个脚本可能需要运行几个月。)
所以我想知道如果没有杀死源PC处理器或编写一个全新的库来处理所有月/年结束,是否有更简单的方法来实现这一目标?
修改
我准备了为我生成文件路径的脚本。我做了什么,是因为date
...
#!/bin/bash
DATE_now=`date +"%Y-%m-%d"`
DATE_end=`date -d "-$1 days" +"%Y-%m-%d"`
echo "Date now: $DATE_now | Date end: $DATE_end"
start_d=`date +%s`
end_d=`date -d "-$1 days" +%s`
synced_day=$DATE_now
synced_day_s=$start_d
daycount=1
echo "" > /tmp/$2_paths
while [ $synced_day_s -ge $end_d ]; do
DAY=$(date -d "$synced_day" '+%d')
MONTH=$(date -d "$synced_day" '+%m')
YEAR=$(date -d "$synced_day" '+%Y')
SYNC_DIR="/var/dav/davserver/$YEAR/$MONTH/$DAY/**"
echo "Adding day ($synced_day) directory: \"$SYNC_DIR\" to synced paths | Day: $daycount"
echo $SYNC_DIR >> /tmp/$2_paths
synced_day=$(date -d "$synced_day -1 days" +"%Y-%m-%d")
synced_day_s=$(date -d "$synced_day" +%s)
daycount=$((daycount+1))
done
并计算使用它的天数,而不仅仅是提取所需的信息。这个脚本给我一个rsync目录列表:
rrr@rRr-kali:~/bash_devel$ bash date_extract.sh 8 Z00163
Date now: 2017-06-29 | Date end: 2017-06-21
Adding day (2017-06-29) directory: "/var/dav/davserver/2017/06/29/**" to synced paths | Day: 1
Adding day (2017-06-28) directory: "/var/dav/davserver/2017/06/28/**" to synced paths | Day: 2
Adding day (2017-06-27) directory: "/var/dav/davserver/2017/06/27/**" to synced paths | Day: 3
Adding day (2017-06-26) directory: "/var/dav/davserver/2017/06/26/**" to synced paths | Day: 4
Adding day (2017-06-25) directory: "/var/dav/davserver/2017/06/25/**" to synced paths | Day: 5
Adding day (2017-06-24) directory: "/var/dav/davserver/2017/06/24/**" to synced paths | Day: 6
Adding day (2017-06-23) directory: "/var/dav/davserver/2017/06/23/**" to synced paths | Day: 7
Adding day (2017-06-22) directory: "/var/dav/davserver/2017/06/22/**" to synced paths | Day: 8
rrr@rRr-kali:~/bash_devel$ cat /tmp/Z00163_paths
/var/dav/davserver/2017/06/29/**
/var/dav/davserver/2017/06/28/**
/var/dav/davserver/2017/06/27/**
/var/dav/davserver/2017/06/26/**
/var/dav/davserver/2017/06/25/**
/var/dav/davserver/2017/06/24/**
/var/dav/davserver/2017/06/23/**
/var/dav/davserver/2017/06/22/**
rrr@rRr-kali:~/bash_devel$
但是,现在我的问题是使用此列表,我一直尝试将--include
和--exclude
命令的多种组合用于--include-files
和--include-from
但是我我得到的结果只有2个:要么一切都没有了,要么就是没有结果。
答案 0 :(得分:1)
由于您已按日期(在目录中)排序文件,因此只需rsync
这些目录即可轻松高效:
#!/bin/bash
maxage="45" # in days, from today
for ((d=0; d<=maxage; d++)); do
dir="/var/dav/davserver/$(date -d "-$d day" +"%Y/%m/%d")"
rsync -avrz server:"$dir" localdir
done
我们正在使用date
来计算today - x days
并迭代从0
到maxage
的所有日子。
编辑:使用算术for
循环而不是迭代GNU seq
范围。
答案 1 :(得分:0)
所以,我已经用以下方法解决了这个问题:
脚本根据实际日期生成路径。详细信息显示在我的初始帖子编辑中。它只是使用date
来完成前几天并管理月末和年终。并从这些日期生成路径。然而,radomir的解决方案更简单,因此我将使用它。 (它与我的基本相同,只是简单的方式将其写下来。)
比我使用--include-files=/tmp/files_list
和-r
a.k.a. --recursive
参数的组合正确使用此路径列表。
(它只复制没有-r
的空目录。如果我使用--include-from
而不是--include-files
,那就是全部或全部。
最终的rsync命令是:
rsync --timeout=300 -Sazrv --force --delete --numeric-ids --files-from=/tmp/date_paths app_core@172.23.160.1:/var/dav/davserver/ /data/snapshots/
然而,这个解决方案并没有删除我身边的旧文件,尽管--delete
参数。可能需要为它制作一个额外的脚本。