Как я могу автоматически копировать файлы на USB-накопитель при подключении к компьютеру?

18

Я ищу решение для копирования всех файлов из определенного каталога на жестком диске в определенный каталог на запоминающем устройстве USB после подключения этого устройства.

У меня есть программа, которая загружает эпизоды подкаста для меня.

Я хотел бы, чтобы эти файлы автоматически перемещались (или, по крайней мере, копировались) в мой mp3-плеер, когда я подключал его к компьютеру.

У меня есть машины с Windows XP и Linux, поэтому решение для любой из них будет работать для меня.

daphshez
источник
2
Я полагаю, вы не удовлетворены запланированной синхронизацией?
Иво Флипс

Ответы:

23

Вы можете довольно легко создать собственное решение для Windows, используя autorun.inf и файл .bat.

Создайте файл bat, чтобы скопировать каталог на ваш USB-диск.

xcopy /e /y c:\podcasts\*.* .\dir_on_usb_drive

Поместите файл bat на свой mp3-плеер и создайте файл autorun.inf, используя эти инструкции

Теперь у вас должно быть собственное решение вашей проблемы, но возможно, что есть готовые решения :)

Paxxi
источник
офигенный совет !!!! +10
in.spite
1
Спасибо за предложение. Файл autorun.inf должен иметь следующий вид: [autorun] open = getpodcasts.bat action = копировать подкасты в проигрыватель. По крайней мере, в winxp sp2 откроется только автозапуск с новыми «копировать подкасты в проигрыватель» вверху. Я не думаю, что есть способ переопределить это и заставить его запускать скрипт молча. Также очевидно, что вы должны включить автозапуск. Наличие команды, которая мне нужна, - это большое улучшение, но она все еще не совсем то, что я искал.
Дафшез
приятно думать! :) +1
3
Разве Microsoft не убрала возможность использовать автозапуск на флэш-накопителе?
Але
10

Для Linux:

Если вы не возражаете против небольших сценариев Python, вы можете написать демон, который прослушивает HAL для событий, а затем запускает сценарий, как только подключается устройство по вашему выбору. Пример сценария будет выглядеть следующим образом :

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
    import dbus.glib
import gobject
import sys
import os

class DeviceManager:
    def __init__(self):
        self.bus = dbus.SystemBus()
        self.bus.add_signal_receiver(self.device_added,
                        'DeviceAdded',
                        'org.freedesktop.Hal.Manager',
                        'org.freedesktop.Hal',
                        '/org/freedesktop/Hal/Manager')

        self.bus.add_signal_receiver(self.device_removed,
                        'DeviceRemoved',
                        'org.freedesktop.Hal.Manager',
                        'org.freedesktop.Hal',
                        '/org/freedesktop/Hal/Manager')

    def udi_to_device(self, udi):
        return self.bus.get_object("org.freedesktop.Hal", udi)

    def device_added(self, udi):
        print 'Added', udi
        properties = self.udi_to_device(udi).GetAllProperties()
        if properties.get('info.category') == u'volume':
            label, dev = properties.get('volume.label'), properties.get('block.device')
            print 'Mounting %s on /media/%s' %(dev, label)
            os.system('pmount %s /media/%s' %(dev, label))

    def device_removed(self, udi):
        print 'Removed', udi

if __name__ == '__main__':
    m = DeviceManager()

    mainloop = gobject.MainLoop()
    try:
        mainloop.run()
    except KeyboardInterrupt:
        mainloop.quit()
        print 'Exiting...'
        sys.exit(0)

Вам просто нужно изменить device_added()функцию, чтобы ограничить ее конкретным устройством и заменить os.system()вызов вашим собственным сценарием.

Для ограничения диска volume.uuidможно использовать это свойство, а полный список доступных свойств можно отобразить с помощью hal-deviceпрограммы.

Чтобы запустить демон при загрузке, просто запустите его с /etc/rc.local.

Grumbel
источник
Я не могу проверить, является ли это хорошим ответом, но вы заслуживаете одобрения только за проблему! Во всяком случае, я бы постарался сделать это немного проще для непрограммистов здесь ;-) как я!
Иво Флипс
9

Windows 7 и автосинхронизация с флэш / USB-устройством при вставке!

Скачайте SyncToy и установите сопряжение вашей папки и имя для синхронизации («SyncTest»)

см. практические рекомендации. Использование SyncToy для создания ночного зеркала моих документов.

  • Запустите консоль управления компьютером
  • Просмотр событий / журналы Windows / система
  • Найти событие вставки медиа
    • «Служба переносимых устройств перечисления устройств перешла в рабочее состояние». (Вам может потребоваться очистить журнал событий и извлечь / повторно вставить носитель, чтобы вызвать это событие журнала)
  • В верхнем окне события щелкните правой кнопкой мыши событие и выберите «Прикрепить задачу к этому событию».
  • Windows откройте «Окно создания базовой задачи»
  • Дайте вашей задаче имя и нажмите «Далее»
  • Информация о событии уже заполнена, следующая
  • Действие должно показать «Запустить программу», далее
  • В окне «Запуск программы» перейдите к SyncToyCmd.exe (или к выбранному вами приложению синхронизации).
  • Добавьте аргументы. Если ваша резервная копия называется SyncTest, введите «-RsyncTest». Не добавляйте кавычки, не добавляйте пробел после -R, командная строка SyncToy (или, возможно, Windows 7) чувствительна к регистру, поэтому SyncTest не равен synctest!
  • Далее, Готово

Вы можете запустить задачу прямо из планировщика задач, чтобы убедиться, что она работает. Теперь единственной другой проблемой, с которой я столкнулся, был запуск моего ноутбука от батарей, в диспетчере задач на вкладке условий снимите флажок «Запускать задачу только при включенном питании компьютера от сети», в противном случае задача будет выполняться только при подключении к сети.

Кроме того, по мере того как USB опрашивает и отключает / переподключает, эта задача будет запускаться каждые пару минут, на самом деле это круто, она все время автоматически синхронизируется с жестким диском USB :)

Стивен Тил
источник
2

Изменить: оказывается, SyncBack SE имеет триггерное действие:

Откройте профиль, перейдите на вкладку «Когда», затем «Вставить». Позволяет указать букву диска, метку или серийный номер.

Однако версия SE не является бесплатной и только для Windows (я думаю)

Или вы можете попробовать добавить событие автозапуска для вашей программы синхронизации (например, SyncToy), используя TweakUI

  • Открыть TweakUI
  • Перейти к моему компьютеру -> автозапуск–> обработчики
  • Нажмите создать
  • Найти, где находится Synctoy (программные файлы по умолчанию)
  • Дважды щелкните логотип программы запуска
  • Выберите все медиа-радио кнопки в списке ниже.
  • Нажмите ок
  • Нажмите применить.

  • Теперь подключите ваш флеш-накопитель.

  • В моем компьютере щелкните правой кнопкой мыши диск и выберите свойства.
  • Нажмите вкладку автозапуска
  • Выберите музыку из выпадающего меню.
  • Нажмите переключатель «выбрать действие для выполнения»
  • Теперь выберите синхронизацию с логотипом SyncToy.
  • Повторите для других опций, указанных в раскрывающемся меню.
  • Нажмите применить, затем ок.
  • Извлеките и снова вставьте диск, чтобы посмотреть, сработал ли

Я не могу найти какую-либо (другую) программу, которая запускается автоматически при подключении вашего USB-устройства.

Все они полагаются на планирование, чтобы начать синхронизацию. Вы можете решить, что это запланировано каждый наш, он просто потерпит неудачу, если USB-устройство не подключено, и будет работать, если оно есть.

Но, честно говоря, было бы проще, если бы вы просто щелкнули по кнопке синхронизации, вам также пришлось бы вручную подключить USB-устройство.

Во всяком случае, я также нашел инструмент синхронизации, который работает как в Linux, так и в Windows: DirSync Pro, который полностью бесплатный, работает на Java и имеет приятный графический интерфейс:

*  Synchronization
      o Powerful synchronization algorithm.
      o Bidirectional (Two way) and Unidirectional (One way) synchronization mode.
      o Option for various behavior of conflict resolution for Bidirectional Synchronization.
      o Synchronizes unlimited number of folders.
      o Large number of options to change the synchronization behavior.
      o Option to synchonise subdirectories recursively.
      o Synchronizes files/folders any file system (FAT, FAT16, FAT32, NTFS, WinFS, UDF, Ext2, Ext3, ...).
      o Synchronizes files from/to network drives
      o Synchronizes files from/to any mounted devices (Harddisks, USB-Sticks, Memory cards, External drives, CD/DVD's, ...).
      o Synchronization could be used for making incremental backups.
      o Option to create up to 50 backups from the modified/changed files before synchronization.
      o Option to define a backup folder.
      o Option for handling symbolic links.
      o Option for handling time-stamps.
* General
      o Easy, clear and user-friendly graphical user interface, no unnecessary gadget you never use.
      o Runs on every modern operating system including Windows™, Linux™ and Macintosh™
      o It is Portable! It does not need any installation. Just run the application!
      o Open source, it is 100% free of charge, 100% free of commercial text, 100% free of advertisements and 100% free of spyware.
      o No time/function limitations
      o Uses no local database, so no overhead
      o Does not need any installation. Just download and run it. You can put it on you USB-stick en you can run it on any computer/any platform.
* Logging
      o Advanced logging/reporting facilities. Just select a log level and define where to write the log.
      o Option to log on application level (default log)
      o Option to log on each directory level (dir log)
      o Option to define the log leven (how much to log)
Иво Флипс
источник
1
Вы могли бы объединить это с запланированной задачей, которая использует новые триггерные события в Vista и Windows 7, чтобы она запускалась при подключении USB-устройства.
Пакси
1
Я думаю, что решение автозапуска, упомянутое в другом ответе, могло бы сработать
Ivo Flipse
Как примечание, я считаю, что функции «при вставке» являются новыми для SyncBack SE 5.
daphshez
1

Я попробовал метод Стивена, но событие USB не отображалось в «Просмотр событий / Журналы Windows / Система» (я использую Windows 7). Я немного покопался и обнаружил, что события вставки USB находятся в «Просмотр событий / Журналы приложений и служб / Microsoft / Windows / DriverFrameworks-UserMode / Operational». Попробуйте сначала очистить журнал (просто, чтобы упростить поиск нужного события), затем вставьте USB-накопитель. Обновите журнал, и должно появиться несколько событий. Я выбрал самое верхнее событие (то есть самое последнее) и назначил ему задачу (убедитесь, что описание события выглядит так, как будто оно содержит что-то конкретное для конкретного USB-накопителя, который вы вставили).

Я использовал бесплатную программу SyncBack для фактической синхронизации. Прекрасно работает!

GordonM
источник
1

Я просто использую AUTORUN.INF с несколькими пакетами для синхронизации ключевых папок. Очень просто, очень эффективно.

Кроме того, если у вас есть только для чтения, заархивированный файл autorun.inf содержит жесткие контрактные вирусы usb-stick.

Слабосоленая
источник
1

Вы просто просто забывают ""и конец ".\dectory\" ← , которые заканчиваются \косой чертой , а также.

Оригинальная пакетная формула работает, это только сейчас дни, Есть много места в каталогах, командных файлах и командной строке HATE тех.

Как выглядит моя:

xcopy "F:\Web Stuff\Web Dev\Dev_FactorY Designs\*.*" ".\HTML_PROJ\Web Stuff\Web Dev\Dev_FactorY Designs\" /e /y
GimmiLFactorY
источник
1

В Linux вместо постоянно запущенной программы для прослушивания событий вы можете использовать уже запущенные. Вы можете добавить несколько хуков в udev, которые монтируют устройство во временную папку и затем запускают rsync для синхронизации нескольких каталогов.

Кстати, вы можете определить конкретные действия в соответствии с сигнатурой вашего устройства: синхронизировать ваши рабочие документы, когда вставлен определенный ключ, или вашу музыку, если вставлен MP3-плеер USB, или ваши книги при подключении Kindle.

Daduke
источник
1

Когда я настраивал небольшую систему наблюдения с Raspberry Pi, которая работала на Raspbian Wheezy, мне нужно было постоянно перемещать все файлы из папки FTP, которая была загружена IP-камерой. Итак, я написал скрипт в домашнем каталоге (~) и вызывал его раз в минуту с помощью cron

crontab -e
*/1 * * * * sudo ~/move_images_to_usb

move_images_to_usb - это обычный bash-скрипт, я раньше не писал скрипты для bash, но ...

#!/bin/bash

if df | grep "sda1"
then
    mkdir /media/usb0/ipcam1
    cp -r /var/ftp /media/usb0/ipcam1
    rm /var/ftp/*
fi

Когда USB-диск вставлен, он называется sda1 (другой диск будет sdb1, поэтому он не будет работать)

57ar7up
источник
0

Я использую программу-репликатор от Karenware. Она является автором множества небольших полезных программ для Windows (вспомним PowerToys с первых дней W98 / W2K / XP).

Вот ссылка. http://www.karenware.com/powertools/ptreplicator.asp

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

Это бесплатно!


источник
Благодарность; но моя проблема не в самой копии (это просто набор файлов, находящихся в одном каталоге), а в том, чтобы сделать эту копию в нужное время. Запланированное задание приятно, но не совсем то, что я искал.
Дафшез
0

Это старая ветка, но я подумала, что сделаю это здесь для всех, кто этого хочет. Измените соответствующую информацию в соответствии с вашими потребностями, тогда она все сделает за вас. Благодарим /superuser//users/232313/tyler, который сделал первую итерацию этого.

@echo off
cls
echo waiting
goto check

Change the STUFF TO COPY location to the folder that you want 
everything inside to be send to the usb's, and change the 3 instances of 
G: to whatever drive letter that the USB uses.
Good Luck!

:start
set choice=
robocopy "C:\STUFFTOCOPY" "G:" /E
echo Waiting for removal
goto wait

:check
timeout /t 1 /nobreak >nul
if exist "G:" (goto start) else goto check

:wait
timeout /t 1 /nobreak >nul
if exist "G:" (goto wait) else (
echo removed
echo waiting
goto check
)
edeetee
источник