Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >跟踪文件夹更改/ Dropbox更改

跟踪文件夹更改/ Dropbox更改
EN

Stack Overflow用户
提问于 2012-09-09 11:05:36
回答 3查看 2.6K关注 0票数 10

首先:我知道pyinotify

我想要的是一个使用Dropbox上传到我的家庭服务器的服务。

我将在我的家庭服务器上有一个Dropbox的共享文件夹。每当共享该文件夹的其他人将任何内容放入该文件夹时,我希望我的家庭服务器等待它完全上载,并将所有文件移动到另一个文件夹,并从Dropbox文件夹中删除这些文件,从而节省Dropbox空间。

这里的问题是,我不能只是跟踪文件夹中的更改并立即移动文件,因为如果有人上传了一个大文件,Dropbox已经开始下载,因此会显示我家庭服务器上文件夹中的更改。

有什么变通方法吗?使用Dropbox API可以做到这一点吗?

我没有尝试过,但是Dropbox CLI version似乎有一个'filestatus‘方法来检查当前的文件状态。当我自己试过的时候,我会报告的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-12 11:15:44

这是一个Ruby版本,它不会等待Dropbox空闲,因此实际上可以开始移动文件,同时它还在同步。此外,它还忽略了...。它实际上检查给定目录中每个文件的文件状态。

然后,我将以cronjob或在单独的screen中运行此脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
directory = "path/to/dir"
destination = "location/to/move/to"

Dir.foreach(directory) do |item|
    next if item == '.' or item == '..'
    fileStatus = `~/bin/dropbox.py filestatus #{directory + "/" + item}`
    puts "processing " + item
    if (fileStatus.include? "up to date")
        puts item + " is up to date, starting to move file now."
        # cp command here. Something along this line: `cp #{directory + "/" + item + destination}`
        # rm command here. Probably you want to confirm that all copied files are correct by comparing md5 or something similar.
    else
        puts item + " is not up to date, moving on to next file."
    end
end

这是完整的脚本,我最终得到了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# runs in Ruby 1.8.x (ftools)

require 'ftools'

directory = "path/to/dir"
destination = "location/to/move/to"

Dir.glob(directory+"/**/*") do |item|
    next if item == '.' or item == '..'
    fileStatus = `~/bin/dropbox.py filestatus #{item}`
    puts "processing " + item
    puts "filestatus: " + fileStatus
    if (fileStatus.include? "up to date")
        puts item.split('/',2)[1] + " is up to date, starting to move file now."
        `cp -r #{item + " " + destination + "/" + item.split('/',2)[1]}`

        # remove file in Dropbox folder, if current item is not a directory and 
        # copied file is identical.
        if (!File.directory?(item) && File.cmp(item, destination + "/" + item.split('/',2)[1]).to_s)
            puts "remove " + item
            `rm -rf #{item}`
        end
    else
        puts item + " is not up to date, moving to next file."
    end
end
票数 1
EN

Stack Overflow用户

发布于 2012-09-11 20:52:40

正如您在问题中提到的,有一个Python dropbox CLI客户端。它返回“空闲...”当它不主动处理文件时。我能想到的实现所需内容的最简单机制是while循环,它检查dropbox.py filestatus /home/directory/to/watch的输出并执行内容的scp,如果成功,则删除内容。然后睡了五分钟左右。

类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
from subprocess import check_call, check_output
DIR = "/directory/to/watch/"
REMOTE_DIR = "user@my_server.com:/folder"

While True:
    if check_output(["dropbox.py", "status", DIR]) == "\nIdle...":
        if check_call(["scp", "-r", DIR + "*", REMOTE_DIR]):
            check_call(["rm", "-rf", DIR + "*"])
    time.sleep(360)

当然,在测试这样的东西时我会非常小心,把错误的东西放在第二个check_call中,你可能会失去你的文件系统。

票数 2
EN

Stack Overflow用户

发布于 2012-09-11 22:02:49

你可以运行incrond,让它等待Dropbox文件夹中的IN_CLOSE_WRITE事件。那么它将仅在文件传输完成时被触发。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12338544

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文