entr - 监视一个目录里的文件是否发生改变,在改变的时候运行指定命令 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Livid
231.53D
590.75D
V2EX    Linux

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

  •  
  •   Livid
    PRO
    2020-11-28 01:57:41 +08:00 7952 次点击
    这是一个创建于 1861 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    PRO
       2020-11-28 02:09:55 +08:00
    @zhuzhibin

    某个 Windows only 的图片生成软件,每次输出目录里增加了新文件的时候,自动调用流水线上的下一环节。
    GG668v26Fd55CP5W
        3
    GG668v26Fd55CP5W  
       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
    PRO
       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
    版主,你不会注册个马甲来发常规贴吗,你这样冠冕堂皇的发帖感觉怪怪的。。
    vilicvane
        13
    vilicvane  
       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,这种好像只要有改变过、就会自动更新,本地传云端是这个触发!

    云端同步到本地是定时吗
    momo1999
        21
    momo1999  
       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
     
       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     Solana     2494 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 08:22 PVG 16:22 LAX 00:22 JFK 03:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86