使用 Windows 7,我有一个设置了共享文件夹的服务器。如果我打开其中一个文件夹并取出一个文件并将其移动到子文件夹,这是即时的 - 该文件显然只在服务器上移动。对于打开了相同共享文件夹的两个窗口也是如此。
另一方面,如果我在同一台服务器上打开另一个共享文件夹并在它们之间移动文件,则需要很长时间 - 就像将文件从第一个共享下载到我计算机的临时文件夹中,然后将其上传到另一个共享。
有没有办法在不同的共享之间移动文件,而不需要我的电脑下载它们?我需要一定的速度,因为文件通常很大。
答案1
当您说“另一个共享文件夹”时,您是指“不同文件共享中的文件夹(即不同的映射驱动器)”吗?如果是这样,那就是问题所在,而且没有简单、神奇的解决方法。当您移动从一个文件夹到另一个文件夹在同一卷上,操作系统只需在目标文件夹中写入新目录条目并擦除源文件夹中的旧目录条目即可 — 无需访问文件数据。当您复制一个文件,操作系统必须读取每个数据块并将其写入新位置。卷之间的移动可能就像物理上分开的磁盘之间的移动一样 — — 它必须被视为复制,然后删除源文件 — — 因为目录条目不能指向不同卷上的数据块。
PS 讽刺的是,在物理上独立的磁盘之间移动甚至可能快点而不是在同一磁盘上的分区(卷或“共享”)之间移动,因为在后一种情况下,磁盘 I/O 头需要在源磁柱面和目标磁柱面之间来回跳转。
答案2
虽然我错过了这顿盛宴,但这里还是有食谱,我相信这是实用方法,但有一些先决条件。
核心思想告诉服务器将特定位置(当然是 Samba 共享中的一个位置)的对象移动到其他地点(当然是在其他Samba 共享)。
inotifywait
是厨师,其他厨师分别叫while
、、read
和mv
。这就是我们晚餐的团队。厨房(或者可能是餐厅)如下所示:
Samba shares ├─share.1 │ ├─recv │ ├─to.share.2 │ ├─to.share.3 │ └─[...] ├─share.2 │ ├─recv │ ├─to.share.1 │ ├─to.share.3 │ └─[...] ├─share.3 │ ├─recv │ ├─to.share.1 │ ├─to.share.2 │ └─[...] └─[...]
假设用户登录到 share.x。如果用户想要将 share.x 中的某些内容移动/复制到 share.y,操作如下:
选取 share.x 内的对象,并将其移动/复制到
share.x/to.share.y
。服务器正在
to.share.*
用 监视这些文件夹inotifywait
,因此它知道该开始工作了。服务器将里面的对象移动
share.x/to.share.y
到share.y/recv
。完毕!
先决条件包括如上所示的特定文件夹结构、在服务器上运行以执行实际mv
操作的作业/服务/脚本。
我确实有自己的脚本代码可以与您分享,但还有很多改进空间:
inotifywait -m "$source_dir" --format '%w%f' -e moved_to,create,modify | while read file; do mv -v "$file" "$dest_dir"; done
修改这些$source_dir
以$dest_dir
满足您自己的需要。
我使用supervisor
来管理一堆类似上面的脚本来实现我的“Samba 传送”。如果你不熟悉supervisor
,请参阅http://supervisord.org/以及关于此问题的其他答案。
答案3
最简单/快速而又肮脏的方法是从服务器本身执行此操作,或者创建一个包含两个目标共享作为子文件夹的共享(例如\\servername\c$
)。