本地副本更改时自动操作文件夹的远程副本
Automatically actioning remote copy of folder when local copy changes
EDIT: I see someone has voted to close this as "too broad a question", but the last time I posted asking how to do something, I
was asked to provide more detail about what and why I wanted to do it.
So... can't win! I'm only asking one question: "how to action remote copy of folder when local copy changes". I'm not asking how to rename, renumber or make zip files, just explaining that this is what I need to do as part of the copy. I really can't think of a less detailed way of asking
this without the obvious (but wrong) answer being "just use rsync".
我想在 Ubuntu 18.04 上根据 Dropbox 文件夹中完成的上传 activity 自动复制文件夹(其他服务也可以添加文件)。我需要:
- 保持源文件夹不变。
- 如果还没有复制的文件名,则用数字作为前缀 -(
find . -name '[[:digit:]]*.mp3'
等)
- 清理文件名中的撇号(例如使用“detox”)。
- 在远程端创建文件夹的 zip。
- 如果将来源文件夹发生任何变化,请在远程副本上重新复制并重新创建 zip 文件夹。
示例:20190203 的 SOURCE 文件夹
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 运行ning 一个包含以下内容的脚本:
SCANDIRS="$(find $BASEDIR -type f -mmin +15 -mmin -45 -printf "%h\n" | sort -u | xargs -n 1 realpath)"
然后它循环遍历 scandirs 并发挥魔力,但这可能有很多我没有预见到的问题,每小时只能 运行 一次,并且不允许更新旧文件夹。
我知道 rsync -av --delete
如果它是 只是 文件,那么使用常规 crontab 会起作用,但我完全不知道如何做我想做的事。复制的文件夹将驻留在同一个本地文件系统上(然后 s3 sync
远程编辑,如果你想知道的话!)。
我认为 inotifywait 可能是一个解决方案,但我不确定如何处理 "wait until folder is quiescent for a certain amount of time but allow future updates at any time" 问题。
谢谢。
总结一下我的意见,一个简单的 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
EDIT: I see someone has voted to close this as "too broad a question", but the last time I posted asking how to do something, I was asked to provide more detail about what and why I wanted to do it. So... can't win! I'm only asking one question: "how to action remote copy of folder when local copy changes". I'm not asking how to rename, renumber or make zip files, just explaining that this is what I need to do as part of the copy. I really can't think of a less detailed way of asking this without the obvious (but wrong) answer being "just use rsync".
我想在 Ubuntu 18.04 上根据 Dropbox 文件夹中完成的上传 activity 自动复制文件夹(其他服务也可以添加文件)。我需要:
- 保持源文件夹不变。
- 如果还没有复制的文件名,则用数字作为前缀 -(
find . -name '[[:digit:]]*.mp3'
等) - 清理文件名中的撇号(例如使用“detox”)。
- 在远程端创建文件夹的 zip。
- 如果将来源文件夹发生任何变化,请在远程副本上重新复制并重新创建 zip 文件夹。
示例:20190203 的 SOURCE 文件夹
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 运行ning 一个包含以下内容的脚本:
SCANDIRS="$(find $BASEDIR -type f -mmin +15 -mmin -45 -printf "%h\n" | sort -u | xargs -n 1 realpath)"
然后它循环遍历 scandirs 并发挥魔力,但这可能有很多我没有预见到的问题,每小时只能 运行 一次,并且不允许更新旧文件夹。
我知道 rsync -av --delete
如果它是 只是 文件,那么使用常规 crontab 会起作用,但我完全不知道如何做我想做的事。复制的文件夹将驻留在同一个本地文件系统上(然后 s3 sync
远程编辑,如果你想知道的话!)。
我认为 inotifywait 可能是一个解决方案,但我不确定如何处理 "wait until folder is quiescent for a certain amount of time but allow future updates at any time" 问题。
谢谢。
总结一下我的意见,一个简单的 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