场景:在 Linux 桌面上安装了一个 IDE,用于本地编辑 PHP 文件。每次保存文件时,我都希望此更改显示在运行 Apache 的 Linux 服务器上。该服务器有 ssh(以及 samba 和 nfs)。
作为参考,当我在 Windows 上编辑文件时,我最终发现 WinSCP 正是我所需要的工具 - WinSCP 具有此功能,具有初始同步然后持续更新,使用文件系统监视服务:“保持远程目录为最新”。
在 Linux 上,有人可能会说可以使用 sshfs 来完全避免同步的需要。在 Windows 上,samba-share 也可以起到同样的作用。但是,我希望 IDE 能够处理本地文件(在 SSD 磁盘上!),而不必通过网络进行 PHP 索引等操作,这需要很长时间。
但是 sshfs 可能仍然是解决方案的一部分 - 因此只需要在两个本地目录之间进行持续同步。
有什么想法或指点吗?
答案1
您还可以使用inotifywait
inotify-tools 包。
inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
echo need to rsync $MODFILE ...
done
答案2
同步将是一个很好的解决方案。
Lsyncd 监视本地目录树事件监视器接口(inotify 或 fsevents)。它会在几秒钟内聚合并组合事件,然后生成一个(或多个)进程来同步更改。默认情况下,这是 rsync。因此,Lsyncd 是一种轻量级实时镜像解决方案,安装起来相对容易,不需要新的文件系统或块设备,也不会影响本地文件系统的性能。
底线是,它使用与其他答案所建议的相同类型的工具来完成工作(inotify 和 rsync),但对于不熟悉 shell 脚本的人来说,设置起来更容易。
答案3
我非常需要这个,因为我的代码需要在远程机器上运行,而我在本地机器上编写代码。我发现了一个不错的工具,你可以使用它来持续监控本地文件夹并将它们同步到远程或本地文件夹:https://github.com/axkibe/lsyncd
通过 ssh 持续同步本地目录与远程机器的简单命令是:
lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>
就像任何其他 rsync 命令一样,请确保您提供的文件夹路径正确,并在运行命令之前进行检查。我差点因为忘记提供正确的目标目录而导致我的一台远程机器死亡。请确保您没有遗漏远程路径,并且除非您知道自己在做什么,否则不要使用“/”。
答案4
我曾经做过的一件事是让一个 bash 脚本ls -l
循环运行(带一些休眠)并与之前的输出进行比较。如果它发生了变化,请进行同步。
#!/bin/bash
listcommand="ls -l $*"
newfilelist=$( $listcommand )
while true
do
if [[ $oldfilelist != $newfilelist ]]
then
oldfilelist=$newfilelist
# run your synchronization tool
fi
sleep 10 || exit 2
newfilelist=$( $listcommand )
done
在新终端中以文件名作为参数启动此脚本(放入同步工具后)。
(我用它来开始编译,而不是同步,但这会以类似的方式工作。)