Dropbox klasörüne yüklendiğinde dosyayı taşımak için inotifywait kullanın


12

CentOS üzerinde açılan kutumda görünür görünmez hemen başka bir klasöre bir dosyayı taşımak için bir yol bulmaya çalışıyorum.

Ben bazı ipuçları için internet scoured var ama ben inotifygöründüğü gibi dosyayı işleyecek bir komut dosyası çağırmak için kullanmanız gereken gerçeğinden daha fazla elde edemezsiniz .

BASH bilgim çok sınırlıdır ve bunu PHP'de yazabileceğimden şüpheliyim.

Başka bir deyişle, dosyayı göründüğü anda başka bir klasöre nasıl taşıyabilirim inotify?


Dosyanın adı sürekli olarak tahmin edilebilir mi? Yoksa konumu mu? Daha fazla detay yardımcı olur ...
jasonwryan

@jasonwryan Bir dropbox klasörü bu yüzden konum tutarlı. Ve bu klasöre bırakılan tüm dosyalar için geçerlidir .
Ortix92

Yanıtlar:


13

Bu basit bir yaklaşımdır:

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

Taşımak istediğiniz dosya türleri hakkında daha fazla ayrıntıyla, biraz kontrol, günlük kaydı vb. Ekleyebilirsiniz.


Önerilen cevapların hiçbirini test edemedim. Her şey geldi. ASAP yapacak! Yine de bir sorum var. Bunu bir bash dosyasına koyacak ve çalıştıracak olsaydım, arka planda çalışacağını varsayıyorum, değil mi? Ben her zaman bir komut dosyası 1 kez çalışma şey olduğunu hissediyorum var, ama burada inotifywait çalışmaya devam ediyor, doğru mu?
Ortix92

2
diskte tam olarak kopyalanamayan bir dosyada createyapacağınız için olayı dinlemek doğru mvdeğildir. close_writeBunun yerine etkinliği kullanarak @Gilles yanıtına bakın .
fduff

3
@fduff Gilles cevap her zaman yapılacak doğru şey ...
jasonwryan

17

Komut inotifywait, belirtilen dizinin içeriği her değiştiğinde bir ileti yazdırır. Doğru etkinliği seçmeniz gerekir: dosya oluşturulduğunda değil, Dropbox indirmeyi tamamladığında. Dropbox'ın nasıl çalıştığını tam olarak bilmiyorum. Dosyaya son yerine yazarsa, close_writeolayları dinleyin . Dosyaya geçici bir konuma yazar ve sonra yerine taşırsa, moved_toolayları dinleyin . Seçeneklerini geçmek -m -qiçin inotifywaitbu olaylar için dinleme tutar böylece (varsayılan olarak, sadece bir sonraki olay için bekler) ve sadece ilgili mesajlar yazdırır.

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
Bu, adlarında yeni satırlar içeren dosyalar için başarısız olur. inotifywaitBoş değerli sonlandırılmış dosya adları almanın bir yolunu bulamadım . Yapabileceğim en iyi şey, örneğin yeni satırdan daha az olası bir karakter %f$'\001'kullanmak -d $'\001've while IFS= read -rveya ile kullanmaktı xargs.
sonraki duyuruya kadar duraklatıldı.

1
@DennisWilliamson Evet, inotifywaitbu şekilde sinir bozucu. //%fİzlenecek yol olmadığı sürece dosya adı hiçbir zaman çift eğik çizgi içermeyeceğinden, şöyle bir şey kullanabilirsiniz ; sonra sıkıntı ayrıştırma tarafındadır.
Gilles 'SO- kötü olmayı kes'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.