如何使用 cron 来实现这个功能?
- 今天:
cp * ~/destination.0
- 明天:
cp * ~/destination.1
- 明天:
cp * ~/destination.0
- 明天:
cp * ~/destination.1
...等等。
任何帮助将不胜感激!
答案1
一句话:
0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))
解释:
$(( $(date -d 0:00 +%s)/(3600*24) % 2))
- 将返回
+%s
今天 0:00 (-d 0:00
) 的时间戳(以秒为单位) 。 - 除以
(3600*24)
将返回从 UNIX 纪元开始的天数。 %2
将返回 0 或 1 来表示自 unix 纪元开始以来的奇数天或偶数天。
答案2
我同意“每天运行 cronjob,在脚本中切换目录”的答案,但我会这样做:
#!/bin/bash
# use hidden link
last=$HOME/.last_destination
#
declare -a dirs
dirs[0]="destination.0"
dirs[1]="destination.1"
#
target=
#
# If $last is a link, it points to the last used directory. Otherwise,
# initialize it and use $HOME/destination.0
if [[ -L "$last" ]] ; then
# get the name of the linked dir
old="$(stat --printf="%N" "$last" | cut -d\' -f4)"
if [[ "$old" == "${dirs[0]}" ]] ; then
target="${dirs[1]}"
else
target="${dirs[0]}"
fi
else
# "$last" is not a link - first time initialization
target="${dirs[0]}"
fi
# now, with $target set, point the $last link at $target, for next time
rm "$last"
ln -s "$target" "$last"
#
# debugging printouts - remove in real life
echo "$target"
ls -l "$last"
答案3
~/destination.0
如果在偶数日期和奇数日期写入都可以~/destination.1
,则以下 crontab 行应该可以工作。它在午夜(0 分钟,0 小时,行上的前两项)开始备份,
0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"
有关 crontab 语法的解释,请参阅此链接,
在终端窗口中测试该行的命令部分,
echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"
当它起作用时,你可以替换cd dir2copy
为cd to-the-actual-directory-you-want-to-copy
,替换~
使用/home/your-home-directory
和删除这两个echo
词来让它完成真正的工作。
再次测试,然后修改 crontab 行。(crontab 中的环境可能需要程序、目录和数据文件的明确完整路径。)
/bin/date '+%d'
查找月份中的日期,并%
进行余数运算,得出0
或1
,附加在命令行的末尾。
您可能更喜欢/bin/date '+%j'
,它可以查找一年中的某一天,例如今天,12 月 1 日,是第#335
。
答案4
每天从 cron 运行此脚本:
/bin/sh #!/bin/sh 设置-e cp * ~/目的地.0 mv ~/destination.0 ~/destination.last mv ~/目的地.1 ~/目的地.0 mv ~/目的地.last ~/目的地.0