Usa inotifywait per spostare il file quando viene caricato nella cartella dropbox


12

Sto cercando di trovare un modo per spostare immediatamente un file in un'altra cartella non appena appare nel mio dropbox su CentOS.

Ho cercato su Internet alcuni indizi, ma non posso andare oltre il fatto che devo usare inotifyper invocare uno script che elaborerà il file così come appare.

Le mie conoscenze BASH sono molto limitate e dubito di poterle scrivere in PHP.

In altre parole, come posso spostare un file in un'altra cartella non appena appare usando inotify?


Il nome del file è costantemente prevedibile? O è la posizione? Maggiori dettagli sarebbero utili ...
Jasonwryan,

@jasonwryan È una cartella dropbox quindi la posizione è coerente. E si applica a qualsiasi file rilasciato in quella cartella.
Ortix92

Risposte:


13

Questo è un approccio semplice:

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

Con maggiori dettagli sui tipi di file che si desidera spostare, è possibile aggiungere un po 'di controllo, registrazione ecc ...


Non sono stato in grado di testare nessuna delle risposte suggerite. Le cose sono andate. Lo farà al più presto! Ho una domanda però. Se dovessi inserirlo in un file bash ed eseguirlo, suppongo che verrà eseguito in background, giusto? Ho sempre la sensazione che uno script sia una cosa da eseguire 1 volta, ma qui inotifywait continua a funzionare, giusto?
Ortix92,

2
l'ascolto createdell'evento non è corretto, poiché si eseguirà una operazione mvsu un file che potrebbe non essere completamente copiato sul disco. Vedi la risposta di @Gilles, usando close_writeinvece event.
fduff,

3
@fduff Vedere la risposta di Gilles è sempre la cosa giusta da fare ...
jasonwryan,

17

Il comando inotifywaitstampa un messaggio ogni volta che cambia il contenuto della directory specificata. Dovrai scegliere l'evento giusto: non quando il file viene creato, ma quando Dropbox ha finito di scaricarlo. Non so esattamente come funzioni Dropbox. Se scrive nel file nella sua posizione finale, ascolta gli close_writeeventi. Se scrive sul file in una posizione temporanea e poi lo sposta in posizione, ascolta gli moved_toeventi. Passare le opzioni -m -qa in inotifywaitmodo che continui ad ascoltare gli eventi (per impostazione predefinita, attende solo l'evento successivo) e stampa solo i messaggi pertinenti.

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
Questo non riesce per i file che includono newline nei loro nomi. Non sono riuscito a trovare un modo per ottenere inotifywaitnomi di file con terminazione null. Il meglio che potevo fare era usare un personaggio che è meno probabile di Newline, per esempio %f$'\001', e usare -d $'\001'con while IFS= read -ro xargs.
In pausa fino a ulteriore avviso.

1
@DennisWilliamson Sì, inotifywaitè fastidioso in questo modo. Puoi usare qualcosa del genere //%f, dato che il nome del file non conterrà mai una doppia barra finché il percorso da guardare non lo fa; quindi il fastidio è sul lato dell'analisi.
Gilles 'SO- smetti di essere malvagio'
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.