gpt4 book ai didi

linux - rsync 只同步小于 xy 天的文件

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:46 25 4
gpt4 key购买 nike

我正在使用 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 个结果:要么所有内容都被 rsync,要么什么都没有。

最佳答案

因为您已经有了按日期排序的文件(在目录中),所以只需 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范围。

关于linux - rsync 只同步小于 xy 天的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44824005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com