本地副本更改时自动操作文件夹的远程副本

时间:2019-02-03 18:06:45

标签: bash ubuntu rsync inotifywait

  

编辑:我看到有人以“过于广泛的问题”为由对此进行了投票,但是上次我发问如何做某事时,我   被要求提供有关我想做什么以及为什么要做的更多详细信息。   所以...赢不了!我只问一个问题:“本地副本更改时如何操作文件夹的远程副本”。我不是在问如何重命名,重新编号或制作zip文件,只是在解释这是我作为副本的一部分需要做的事情。我真的想不出更详细的询问方式   这没有明显的(但错误的)答案是“仅使用rsync”。

我想基于Ubuntu 18.04上Dropbox文件夹中完成的上传活动自动复制文件夹(其他服务也可以添加文件)。我需要:

  • 保持源文件夹不变。
  • 通常以数字前缀复制的文件名-(find . -name '[[:digit:]]*.mp3'等)
  • 清除撇号的文件名(例如使用“ detox”)。
  • 在远端创建文件夹的zip。
  • 如果将来源文件夹中发生任何更改,请在远程副本上重新复制并重新创建zip文件夹。

示例:SOURCE文件夹为20190203

   apostrophe's.mp3
   track01.mp3
   zebra 4.mp3

20190203的REMOTE文件夹(处理后)

   01-apostrophes.mp3
   02-track01.mp3
   03-zebra4.mp3
   20190302.zip

如果远程用户一个月后要在源文件夹中添加 chickens.mp3 并删除 apostrophe's.mp3 ,则该过程将通过重新复制和重命名文件夹,并自动重建zip文件。

所有可能要上传的单个文件都小于10Mb,因此即使是最慢的连接,上传任何一个文件的时间也不会超过15分钟,但整个文件夹的上传最多可能需要45分钟。

我无法根据文件夹大小,文件数或修改日期检查更改,因为将zip文件添加到远程文件夹的操作将更改所有这些更改。

目前,我每小时执行一次crontab,该脚本包含以下内容:

SCANDIRS="$(find $BASEDIR -type f -mmin +15 -mmin -45 -printf "%h\\n" | sort -u | xargs -n 1 realpath)"

然后它遍历scandirs并执行魔术操作,但这可能存在很多我没有预料到的问题,只能每小时运行一次,并且不允许更新较旧的文件夹。

我知道带有常规crontab的rsync -av --delete如果只是 文件也可以使用,但是我完全束手无策。复制的文件夹将驻留在相同的本地文件系统上(如果您想知道,那么可以远程s3 sync进行访问!)。

我认为inotifywait可能是一种解决方案,但是我不确定如何处理“等到文件夹处于静止状态一定时间,但允许以后随时更新”的问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

总结一下我的评论,一个简单的bash脚本框架可以检查是否更改:

SOURCE=/my/folder/to/check
WORK=/my/state/folder

is_initialised(){
    [ -f "$WORK/timestamp" ]
}

has_changed(){
    find "$SOURCE" -cnewer "$WORK/timestamp" | grep -q .
}

update_timestamp(){
    touch "$WORK/timestamp"
}

if ! is_initialised; then
    do_create_zip && update_timestamp || do_show_error
elif has_changed; then
    do_update_zip && update_timestamp || do_show_error
else
    echo "Nothing to do :)"
fi