Перемещение файлов между двумя общими файлами Windows на одном сервере
В Windows 7 у меня есть сервер с настроенными общими папками. Если я открою один из них, возьму файл и переместу его в подпапку, это мгновенно - файл, очевидно, перемещается только на сервер. То же самое для двух окон, имеющих одну и ту же общую папку.
С другой стороны, если я открываю другую общую папку на том же сервере и перемещаю между ними файл, это занимает очень много времени - как, например, загрузка файла с первого общего ресурса на мой компьютер во временную папку, а затем загрузка его на другой общий ресурс.,
Есть ли какой-нибудь способ перемещать файлы между разными общими папками, без того, чтобы мой компьютер загружал их между ними? Я хочу немного скорости, потому что это часто довольно большие файлы.
3 ответа
Несмотря на то, что я опаздываю на праздник, все же, вот рецепт, и я считаю, что это практичный метод, с некоторыми предварительными условиями.
Основная идея заключается в том, чтобы попросить сервер переместить объекты в определенном месте (которое, конечно, находится в одном общем ресурсе 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
управлять кучей сценариев, таких как выше, чтобы сделать мою "телепортацию самбы". Если вы не знакомы с supervisor
Пожалуйста, обратитесь к http://supervisord.org/ и другим ответам об этом.
Когда вы говорите "другая общая папка", вы подразумеваете "папку в другом общем файловом ресурсе (то есть на другом подключенном диске)"? Если так, то это проблема, и не существует легкого, волшебного решения. Когда вы перемещаете файл из одной папки в другую на том же томе , все, что требуется, - это чтобы операционная система записала новую запись каталога в папку назначения и удалила старую запись каталога в исходной папке - данные файла не не нужно быть доступным При копировании файла ОС должна прочитать каждый блок данных и записать его в новом месте. И перемещение между томами также может быть перемещением между физически отдельными дисками - его следует рассматривать как копию с последующим удалением исходного файла - потому что записи каталога не могут указывать на блоки данных на другом томе.
PS По иронии судьбы, перемещение между физически отдельными дисками может быть даже быстрее, чем перемещение между разделами (томами или "общими") на одном диске, потому что в последнем случае дисковые головки ввода-вывода должны перемещаться назад и вперед между источником цилиндр (ы) и целевой цилиндр (ы).
Самый простой / быстрый и грязный способ - это сделать это с самого сервера или создать общий ресурс с обоими целевыми общими папками в качестве подпапок (например, \\servername\c$
).