Come posso copiare automaticamente i file su un'unità USB quando lo collego al mio computer?


18

Sto cercando una soluzione per copiare tutti i file da una directory specifica sul disco rigido, a una directory specifica su un dispositivo di memoria USB, una volta che questo dispositivo è collegato.

Ho un programma che scarica episodi podcast per me.

Vorrei che questi file fossero automaticamente spostati (o almeno copiati) sul mio lettore mp3 dopo averlo collegato al computer.

Ho entrambe le macchine Windows XP e Linux, quindi una soluzione per ognuna di esse funzionerà per me.


2
Presumo che non sei soddisfatto di una sincronizzazione pianificata?
Ivo Flipse,

Risposte:


23

Puoi creare facilmente la tua soluzione per Windows usando autorun.inf e un file .bat.

Crea un file bat per copiare una directory sul tuo drive USB.

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

Posiziona il file bat sul tuo lettore mp3 e crea un autorun.inf usando queste istruzioni

Ora dovresti avere la tua soluzione personalizzata per il tuo problema, ma è certamente possibile che ci siano soluzioni pre-realizzate là fuori :)


suggerimento fantastico !!!! +10
entro il

1
Grazie per il suggerimento Autorun.inf dovrebbe essere: [autorun] open = getpodcasts.bat action = copia podcast sul lettore Almeno winxp sp2, questo aprirà solo AutoPlayer, con il nuovo "copia podcast sul giocatore" in alto. Non penso che ci sia un modo per ignorare questo e forzarlo a eseguire lo script in silenzio. Inoltre, ovviamente, devi attivare AutoPlay. Avere il comando di cui ho bisogno di pop sulla finestra è in realtà un grande imporvement, ma non è ancora esattamente quello che stavo cercando.
daphshez,

bel pensiero! :) +1

3
Microsoft non ha semplicemente rimosso la possibilità di utilizzare l'esecuzione automatica su una chiavetta USB?
Ale

10

Per Linux:

Se non ti dispiace un po 'di scripting Python potresti scrivere un demone che ascolta HAL per eventi e quindi lancia uno script una volta che un dispositivo di tua scelta è stato collegato. Uno script di esempio sarebbe simile a questo :

#!/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)

Devi solo modificare la device_added()funzione per limitarla al dispositivo specifico e sostituire la os.system()chiamata con il tuo script personalizzato.

Per limitarlo all'azionamento è volume.uuidpossibile utilizzare la proprietà e un elenco completo delle proprietà disponibili può essere visualizzato con il hal-deviceprogramma.

Per avviare il demone all'avvio, basta avviarlo /etc/rc.local.


Non riesco a verificare se questa è una buona risposta, ma meriti un voto solo per il problema! Ad ogni modo, proverei a semplificare un po 'i non programmatori qui ;-) come me!
Ivo Flipse,

9

Windows 7 e sincronizzazione automatica con il dispositivo flash / USB al momento dell'inserimento!

Scarica SyncToy e stabilisci l'associazione delle cartelle e sincronizza il nome ("SyncTest")

vedi: Come fare: usare SyncToy per creare un mirror notturno dei miei documenti

  • Esegui la console di gestione del computer
  • Visualizzatore eventi / registri di Windows / sistema
  • Trova l'evento di inserimento multimediale
    • "Il servizio Portable Device Enumerator Service è entrato nello stato di esecuzione." (Potrebbe essere necessario cancellare il registro eventi ed espellere / reinserire il supporto per attivare questo evento di registro)
  • Nella finestra dell'evento superiore, fai clic con il pulsante destro del mouse sull'evento e seleziona "Allega attività a questo evento"
  • Windows apre "Crea finestra attività di base"
  • Dai un nome al tuo compito e premi il prossimo
  • Le informazioni sull'evento sono già state compilate, successivamente
  • L'azione dovrebbe mostrare "Avvia un programma", successivo
  • Nella finestra Avvia un programma, seleziona SyncToyCmd.exe (o l'app di sincronizzazione selezionata)
  • Aggiungi argomenti. Se l'associazione di backup si chiama SyncTest, immettere "-RsyncTest". Non aggiungere virgolette, non aggiungere uno spazio dopo -R, la riga di comando SyncToy (o forse Windows 7) fa distinzione tra maiuscole e minuscole, quindi SyncTest non equivale a synctest!
  • Quindi, Fine

È possibile eseguire l'attività direttamente dall'Utilità di pianificazione per verificare che funzioni. Ora l'unico altro problema che ho avuto è stato quello di far funzionare il mio laptop a batterie, in Task Manager nella scheda condizioni, deselezionare "Avvia l'attività solo se il computer è alimentato a corrente alternata", altrimenti l'attività verrà eseguita solo quando è collegata la corrente alternata.

Inoltre, poiché USB esegue il polling e si disconnette / riconnette, questa attività verrà eseguita ogni paio di minuti, in realtà è piuttosto interessante, si sincronizza automaticamente con l'HDD USB tutto il tempo :)


2

Modifica: si scopre che SyncBack SE ha un'azione di trigger:

Apri profilo, vai alla scheda "Quando", quindi "Inserisci". Ti consente di specificare per lettera di unità, etichetta o numero di serie.

Tuttavia, la versione SE non è gratuita e solo Windows (penso)

Oppure potresti provare ad aggiungere un evento di esecuzione automatica per il tuo programma di sincronizzazione (esempio per SyncToy) usando TweakUI

  • Apri TweakUI
  • Vai al mio computer -> autorun–> gestori
  • Fai clic su Crea
  • Trova dove si trova Synctoy (file di programma come predefinito)
  • Fare doppio clic sul logo del programma di avvio
  • Seleziona tutti i pulsanti di opzione multimediali nell'elenco seguente.
  • Clicca ok
  • Fai clic su Applica.

  • Ora collega la tua pen drive.

  • Nel mio computer, fai clic con il pulsante destro del mouse sull'unità e seleziona Proprietà.
  • Fai clic sulla scheda di riproduzione automatica
  • Seleziona la musica dal menu a discesa.
  • Fai clic sul pulsante di opzione "seleziona l'azione da eseguire"
  • Ora seleziona la sincronizzazione con il logo SyncToy
  • Ripetere l'operazione per le altre opzioni fornite dal menu a discesa
  • Fai clic su applica quindi ok.
  • Rimuovere e reinserire l'unità per vedere se ha funzionato

Non riesco a trovare alcun (altro) programma che si avvierà automaticamente quando si collega il dispositivo USB.

Si basano tutti sulla pianificazione per avviare la sincronizzazione. Potresti decidere di averlo programmato ogni nostro, semplicemente fallirà se il dispositivo USB non è collegato e funzionerà se lo è.

Ma anche onestamente sarebbe più semplice se si fa semplicemente clic sul pulsante di sincronizzazione, è necessario collegare manualmente anche il dispositivo USB.

Comunque ho anche trovato uno strumento di sincronizzazione che funziona sia su Linux che su Windows: DirSync Pro che è completamente gratuito, funziona su Java e ha una bella interfaccia grafica:

*  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
è possibile combinarlo con un'attività schduled che utilizza i nuovi eventi trigger in Vista e Windows 7 per eseguirlo quando è collegato un dispositivo USB.
Paxxi,

1
Penso che la soluzione di esecuzione automatica menzionata nell'altra risposta potrebbe fare il trucco
Ivo Flipse il

Proprio come una nota, credo che le funzionalità "on insert" siano nuove per SyncBack SE 5.
daphshez,

1

Ho provato il metodo di Steven, ma l'evento USB non è stato visualizzato in "Visualizzatore eventi / Registri di Windows / Sistema" (sto usando Windows 7). Ho dato un'occhiata un po 'e ho scoperto che gli eventi di inserimento USB si trovano in "Visualizzatore eventi / Registri applicazioni e servizi / Microsoft / Windows / DriverFrameworks-UserMode / Operational". Prova prima a cancellare il registro (solo per facilitare la ricerca dell'evento desiderato), quindi inserisci l'unità flash USB. Aggiorna il registro e dovrebbe essere visualizzato un gruppo di eventi. Ho scelto l'evento più in alto (ovvero il più recente) e ho assegnato l'attività a quello (assicurati che la descrizione dell'evento sembri avere qualcosa di specifico per la particolare unità USB che hai inserito).

Ho usato il programma gratuito SyncBack per eseguire la sincronizzazione effettiva. Funziona alla grande!


1

Uso solo AUTORUN.INF con alcuni batch per sincronizzare le cartelle delle chiavi. Molto semplice molto efficace.

Inoltre, se si dispone di un file autorun.inf archiviato in sola lettura, è un virus con chiavetta USB a contratto rigido


1

Stai semplicemente dimenticando ""e finendo ".\dectory\" ← Anche quella fine \barra.

La formula batch originale funziona, sono pochi giorni, ci sono molti spazi in directory, file batch e prompt dei comandi ODIA quelli.

Come appare il mio:

xcopy "F:\Web Stuff\Web Dev\Dev_FactorY Designs\*.*" ".\HTML_PROJ\Web Stuff\Web Dev\Dev_FactorY Designs\" /e /y

1

Sotto Linux, invece di avere un programma in esecuzione continuamente per ascoltare eventi, puoi usare quelli già in esecuzione. È possibile aggiungere alcuni hook a udev che monta il dispositivo in una posizione temporanea e quindi avvia rsync per sincronizzare un gruppo di directory.

A proposito, puoi definire azioni specifiche in base alla firma del tuo dispositivo: sincronizza i tuoi documenti di lavoro quando viene inserita una chiave specifica, o la tua musica se è inserito un lettore MP3 di archiviazione di massa USB, o i tuoi libri quando si collega un Kindle lì.


1

Quando stavo installando un piccolo sistema di sorveglianza con Raspberry Pi, che girava su Raspbian Wheezy, dovevo spostare costantemente tutti i file dalla cartella FTP caricata dalla telecamera IP. Quindi, ho scritto lo script nella home directory (~) e l'ho chiamato una volta al minuto con cron

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

move_images_to_usb è un normale script bash, non ero scripting prima su bash, ma ...

#!/bin/bash

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

Quando viene inserita un'unità USB, si chiama sda1 (un'altra unità sarà sdb1, quindi non funzionerà)


0

Uso un programma replicatore di Karenware. È autrice di molti piccoli programmi utili per Windows (pensa a PowerToys dai primi giorni W98 / W2K / XP).

Ecco il link. http://www.karenware.com/powertools/ptreplicator.asp

Impostalo su un programma notturno. Se l'unità USB è collegata, sincronizzerà la cartella di download con i contenuti USB.

È gratis!


Grazie; ma il mio problema non è la copia stessa (è solo un mucchio di file che risiede in una directory), ma farlo accadere al momento giusto. Un compito programmato è carino, ma non proprio quello che stavo cercando.
daphshez,

0

Questo è un vecchio thread, ma ho pensato che avrei potuto farlo qui per chiunque lo voglia. Modifica le informazioni pertinenti in base alle tue esigenze, quindi farà tutto per te. Ringraziamo /superuser//users/232313/tyler che ha effettuato la prima iterazione di questo.

@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
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.