V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Livid
V2EX  ›  Linux

entr - 监视一个目录里的文件是否发生改变,在改变的时候运行指定命令

  •  
  •   Livid · 2020-11-28 01:57:41 +08:00 · 7364 次点击
    这是一个创建于 1491 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/eradman/entr

    挺好用的一个小工具。不知道 Windows 上是否有类似的?
    36 条回复    2020-12-10 22:20:57 +08:00
    zhuzhibin
        1
    zhuzhibin  
       2020-11-28 02:07:26 +08:00 via iPhone
    有啥场景需要运用到?
    Livid
        2
    Livid  
    MOD
    OP
       2020-11-28 02:09:55 +08:00
    @zhuzhibin

    某个 Windows only 的图片生成软件,每次输出目录里增加了新文件的时候,自动调用流水线上的下一环节。
    falcon05
        3
    falcon05  
       2020-11-28 02:20:40 +08:00 via iPhone
    挺好的工具,我之前一直用 nodemon
    ooh
        4
    ooh  
       2020-11-28 02:25:58 +08:00
    fsnotify ?要自己写点代码
    ysmood
        5
    ysmood  
       2020-11-28 02:27:19 +08:00
    一直用自己写的,entr 这种兼容性很差,比如 docker 的 volume 就不行

    我这个是完全跨平台的,感觉也没必要追求无 polling,gitignore 一般就够了 https://github.com/ysmood/kit#guard
    Livid
        6
    Livid  
    MOD
    OP
       2020-11-28 02:32:23 +08:00
    b00tyhunt3r
        7
    b00tyhunt3r  
       2020-11-28 07:21:40 +08:00
    @ysmood 除了 poll 以外还有别的啥实现方法吗
    elfive
        8
    elfive  
       2020-11-28 07:37:20 +08:00 via iPhone
    Windows 下,这种监视文件夹内文件状态改变的程序,都会遇到一个如果大量文件同时改变,容易漏消息的问题……如果一个消息处理不及时,就会漏掉临近的消息……
    loading
        9
    loading  
       2020-11-28 07:56:08 +08:00 via Android   ❤️ 2
    go 语言
    github.com/fsnotify/fsnotify

    针对每个平台用了不同方法,可以看看。
    janda
        10
    janda  
       2020-11-28 08:20:43 +08:00
    同步盘是不是就是通过这类触发的、本地有改变过文件,就会自动上传到网上同步盘!

    云盘文件有改过、客户端也会自动同步回来
    ysc3839
        11
    ysc3839  
       2020-11-28 08:27:48 +08:00 via Android
    Windows 有同功能的 API,不过现成的软件似乎没有?
    maxxfire
        12
    maxxfire  
       2020-11-28 08:44:17 +08:00
    版主,你不会注册个马甲来发常规贴吗,你这样冠冕堂皇的发帖感觉怪怪的。。
    vilic
        13
    vilic  
       2020-11-28 09:06:25 +08:00
    Facebook 有个 watchman https://facebook.github.io/watchman/
    MeteorCat
        14
    MeteorCat  
       2020-11-28 09:59:45 +08:00 via Android
    git 版本变动就行了
    f6x
        15
    f6x  
       2020-11-28 10:03:03 +08:00
    @janda 网盘不需要这种时效性, 反而一个一个处理效率更低.
    直接定时刷
    kimdir
        16
    kimdir  
       2020-11-28 10:03:13 +08:00 via iPhone
    付费的 hazel 是不是也是这个作用
    Jirajine
        17
    Jirajine  
       2020-11-28 10:04:13 +08:00 via Android   ❤️ 2
    zander
        18
    zander  
       2020-11-28 10:08:14 +08:00
    正好手头有一些需求,不过这个对十万级文件量的文件夹支持的好吗。
    pengfei
        19
    pengfei  
       2020-11-28 10:17:16 +08:00   ❤️ 1
    janda
        20
    janda  
       2020-11-28 10:41:43 +08:00
    @f6x 我用的 nextcloud 、onedrive,这种好像只要有改变过、就会自动更新,本地传云端是这个触发!

    云端同步到本地是定时吗
    shuax
        21
    shuax  
       2020-11-28 10:53:33 +08:00
    ::ReadDirectoryChangesW(dir, &notify, sizeof(notify), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME, &dwBytes, &overlapped, NULL);

    主要就这一个 API
    billzhuang
        22
    billzhuang  
       2020-11-28 11:11:40 +08:00
    这类 filewatcher 我记得都有个头痛的问题,就是如果监控的跟目录被删除了,再新建就不会再监控了,要手动处理
    menyakun
        23
    menyakun  
       2020-11-28 15:56:54 +08:00
    我在 mac 和 linux 下用的是 fswatch,我看官方 readme 里面也有 windows 的,不知道行不行
    ysmood
        24
    ysmood  
       2020-11-29 00:50:27 +08:00
    @b00tyhunt3r @loading 目前来讲 poll 是最稳定的方式,类似 FileSystemWatcher,fsnotify 之类的都有诸多兼容问题,比如 fsnotify 自己都说对 mac 支持不好。要是有人能有更好的解决方案我倒是很想学习下。
    guochao
        25
    guochao  
       2020-11-29 21:07:16 +08:00
    Windows 下面有个 Everything 工具,推荐。其中的原理是读取 NTFS 的 USN 日志。我胡乱搜了一下: https://blog.csdn.net/kaooo/article/details/8298537

    对于 Linux 来说内核的 inotify 可以保证每个订阅的修改都通知到程序,Mac/BSD 的大概是 kqueue+fsevents
    raaaaaar
        26
    raaaaaar  
       2020-11-30 07:16:00 +08:00 via Android
    @zhuzhibin #1 监控目录变动然后自动更新部署项目?
    Mithril
        27
    Mithril  
       2020-11-30 07:40:48 +08:00
    @elfive 目前用 FileSystemWatcher 没发现这个问题,不要在消息响应里面写太多东西,直接接到你自己的消息队列里再处理就可以了。
    我基本上每次弄进去几千上万的小文件没见出过问题。
    abersheeran
        28
    abersheeran  
       2020-11-30 09:07:40 +08:00
    Python 有一个 watchdog 的模块,它自带的命令就可以做到你说的这个。如果有更复杂的需求,你甚至可以写几行 Python 代码来解决。并且,Mac 、Linux 、Windows 都支持。
    wangdk23411
        29
    wangdk23411  
       2020-11-30 10:15:33 +08:00
    不错,可以放在 ftp 流程后面做分类处理
    q197
        30
    q197  
       2020-11-30 10:53:07 +08:00
    uwp 也有个函数
    nnnToTnnn
        31
    nnnToTnnn  
       2020-11-30 11:11:23 +08:00
    @Livid 可以用 cygwin 来编译这个程序。
    nnnToTnnn
        32
    nnnToTnnn  
       2020-11-30 11:13:05 +08:00
    QT 有一个 QFileSystemWatcher 感觉也挺方便的。
    digimoon
        33
    digimoon  
       2020-11-30 11:15:03 +08:00
    linux 上我用 inotify,但是这个不能在挂载的网络目录用例如 smb,这个能解决么
    nnnToTnnn
        34
    nnnToTnnn  
       2020-11-30 11:15:50 +08:00
    @nnnToTnnn 32L 我猜的,cygwin 可以编译 linux 的程序,但是兼容性上面还得要自己试试
    LDa
        35
    LDa  
       2020-12-01 04:50:57 +08:00 via iPhone
    插个眼,明天下午来收割方案
    ob
        36
    ob  
       2020-12-10 22:20:57 +08:00
    NewFileGo 可以一试:
    http://www.joejoesoft.com/vcms/170/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2707 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:42 · PVG 22:42 · LAX 06:42 · JFK 09:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.