Gunakan inotifywait untuk memindahkan file saat memuat di folder dropbox

12

Saya mencoba mencari cara untuk segera memindahkan file ke folder lain segera setelah muncul di dropbox saya di CentOS.

Saya telah menjelajahi internet untuk mencari beberapa petunjuk tetapi saya tidak bisa lebih jauh dari kenyataan bahwa saya perlu menggunakan inotifyuntuk memanggil skrip yang akan memproses file seperti yang terlihat.

Pengetahuan BASH saya sangat terbatas dan saya ragu saya bisa menulis ini dalam PHP.

Dengan kata lain, bagaimana saya bisa memindahkan file ke folder lain segera setelah muncul menggunakan inotify?

Ortix92
sumber
Apakah nama file dapat diprediksi secara konsisten? Atau lokasinya? Lebih detail akan sangat membantu ...
jasonwryan
@jasonwryan Ini folder dropbox sehingga lokasinya konsisten. Dan itu berlaku untuk file apa pun yang dijatuhkan di folder itu.
Ortix92

Jawaban:

13

Ini adalah pendekatan sederhana:

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

Dengan detail lebih lanjut tentang jenis file yang ingin Anda pindahkan, Anda dapat menambahkan beberapa pemeriksaan, pencatatan dll ...

jasonwryan
sumber
Saya belum dapat menguji salah satu jawaban yang disarankan. Segalanya muncul. Akan melakukannya ASAP! Saya punya pertanyaan. Jika saya meletakkan ini dalam file bash dan menjalankannya, saya menganggap itu akan berjalan di latar belakang, benar? Saya selalu merasa bahwa script adalah hal yang berjalan 1 kali, tetapi di sini inotifywait terus berjalan, benar?
Ortix92
2
mendengarkan createacara tidak benar, karena Anda akan melakukan mvpada file yang mungkin tidak sepenuhnya disalin pada disk. Lihat jawaban @Gilles, close_writesebagai gantinya gunakan acara.
fduff
3
@fduff Melihat jawaban Gilles selalu merupakan hal yang benar untuk dilakukan ...
jasonwryan
17

Perintah inotifywaitmencetak pesan setiap kali isi dari direktori yang ditentukan berubah. Anda harus memilih acara yang tepat: bukan saat file dibuat, tetapi ketika Dropbox selesai mengunduhnya. Saya tidak tahu persis bagaimana Dropbox beroperasi. Jika menulis ke file di tempat terakhirnya, dengarkan close_writeacara. Jika itu menulis ke file ke lokasi sementara dan kemudian memindahkannya ke tempatnya, dengarkan moved_toacara. Lulus pilihan -m -quntuk inotifywaitsehingga membuat mendengarkan untuk acara (secara default, hanya menunggu acara berikutnya) dan hanya mencetak pesan yang relevan.

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Ini gagal untuk file yang menyertakan baris baru dalam namanya. Saya tidak dapat menemukan cara untuk inotifywaitmenghasilkan nama file yang diakhiri null. Yang terbaik yang bisa saya lakukan adalah menggunakan karakter yang lebih kecil kemungkinannya daripada baris baru, misalnya %f$'\001', dan digunakan -d $'\001'dengan while IFS= read -ratau xargs.
Dijeda sampai pemberitahuan lebih lanjut.
1
@ DennisWilliamson Ya, inotifywaititu mengganggu seperti itu. Anda dapat menggunakan sesuatu seperti //%f, karena nama file tidak akan pernah mengandung garis miring ganda selama jalur untuk menonton tidak; maka gangguan ada di sisi parsing.
Gilles 'SANGAT berhenti menjadi jahat'