4

В Windows 7 у меня есть сервер с настроенными общими папками. Если я открою один из них, возьму файл и переместу его в подпапку, это мгновенно - файл, очевидно, только перемещается на сервер. То же самое для двух окон, имеющих одну и ту же общую папку.

С другой стороны, если я открываю другую общую папку на том же сервере и перемещаю файл между ними, это занимает очень много времени - как, например, загрузка файла с первого общего ресурса на мой компьютер во временную папку, а затем загрузка его на другой общий ресурс. ,

Есть ли какой-нибудь способ перемещать файлы между различными общими папками, без того, чтобы мой компьютер загружал их между ними? Я хочу немного скорости, потому что это часто довольно большие файлы.

3 ответа3

2

Когда вы говорите «другая общая папка», вы имеете в виду «папку в другом общем файловом ресурсе (то есть на другом подключенном диске)»?  Если так, то это проблема, и не существует легкого, волшебного решения.  Когда вы перемещаете файл из одной папки в другую на том же томе, все, что требуется, - это чтобы операционная система записала новую запись каталога в папку назначения и удалила старую запись каталога в исходной папке - данные файла не не нужно получать доступ.  При копировании файла ОС должна прочитать каждый блок данных и записать его в новом месте.  И перемещение между томами также может быть перемещением между физически отдельными дисками - его следует рассматривать как копию с последующим удалением исходного файла - потому что записи каталога не могут указывать на блоки данных на другом томе.

PS По иронии судьбы, перемещение между физически отдельными дисками может быть даже быстрее, чем перемещение между разделами (томами или «общими ресурсами») на одном диске, потому что в последнем случае дисковые головки ввода-вывода должны перемещаться назад и вперед между источником цилиндр (ы) и целевой цилиндр (ы).

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, вот операция:

  1. Выберите объекты внутри share.x, переместите / скопируйте их в share.x/to.share.y .

  2. Сервер отслеживает эти to.share.* помощью inotifywait , поэтому он знает, что пора работать.

  3. Сервер перемещает объекты внутри share.x/to.share.y в share.y/recv .

  4. Готово!

Предварительные условия включают в себя определенную структуру папок, как указано выше, задание / сервис / скрипт, выполняемый на сервере для выполнения реальной операции 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/ и другим ответам об этом.

1

Самый простой / быстрый и грязный способ - это сделать это с самого сервера или создать общий ресурс с обоими целевыми общими папками в качестве подпапок (например, \\servername\c$).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .