Użyj inotifywait, aby przenieść plik podczas ładowania do folderu dropbox


12

Próbuję znaleźć sposób na natychmiastowe przeniesienie pliku do innego folderu, gdy tylko pojawi się on w moim dropboxie na CentOS.

Przeszukałem Internet w poszukiwaniu wskazówek, ale nie mogę uzyskać nic poza faktem, że muszę użyć, inotifyaby wywołać skrypt, który przetworzy plik, jak się pojawi.

Moja wiedza BASH jest bardzo ograniczona i wątpię, czy mogę to napisać w PHP.

Innymi słowy, jak mogę przenieść plik do innego folderu, gdy tylko się pojawi inotify?


Czy nazwa pliku jest konsekwentnie przewidywalna? Czy to lokalizacja?
Przydałby się

@jasonwryan Jest to folder dropbox, więc lokalizacja jest spójna. Dotyczy to każdego pliku upuszczonego w tym folderze.
Ortix92,

Odpowiedzi:


13

To proste podejście:

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

Więcej informacji o typach plików, które chcesz przenieść, możesz dodać sprawdzanie, rejestrowanie itp.


Nie byłem w stanie przetestować żadnej z sugerowanych odpowiedzi. Wszystko się pojawiło. Zrobię to jak najszybciej! Mam jednak pytanie. Gdybym miał to umieścić w pliku bash i uruchomić, zakładam, że będzie działał w tle, prawda? Zawsze mam wrażenie, że skrypt jest działaniem jednorazowym, ale tutaj inotifywait działa dalej, prawda?
Ortix92,

2
nasłuchiwanie createzdarzenia nie jest poprawne, ponieważ zrobisz mvplik, który może nie zostać w pełni skopiowany na dysk. Zobacz odpowiedź @Gilles, używając close_writezamiast tego zdarzenia.
fduff

3
@fduff Widząc, że odpowiedź Gillesa jest zawsze właściwą rzeczą ...
jasonwryan

17

Polecenie inotifywaitdrukuje komunikat za każdym razem, gdy zmienia się zawartość określonego katalogu. Musisz wybrać właściwe zdarzenie: nie po utworzeniu pliku, ale po zakończeniu pobierania przez Dropbox. Nie wiem dokładnie, jak działa Dropbox. Jeśli zapisuje do pliku na swoim ostatecznym miejscu, słuchaj close_writewydarzeń. Jeśli zapisuje plik w tymczasowej lokalizacji, a następnie przenosi go na miejsce, nasłuchuj moved_towydarzeń. Przekaż opcje -m -qdo, inotifywaitaby dalej nasłuchiwał zdarzeń (domyślnie czeka tylko na następne zdarzenie) i drukuje tylko odpowiednie wiadomości.

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
Nie udaje się to w przypadku plików, które zawierają nazwy nowego wiersza. Nie udało mi się znaleźć sposobu na inotifywaitwyświetlanie nazw plików zakończonych znakiem null. Najlepsze, co mogłem zrobić, to na przykład użyć znaku, który jest mniej prawdopodobny niż nowa linia %f$'\001', i użyć -d $'\001'z while IFS= read -rlub xargs.
Wstrzymano do odwołania.

1
@DennisWilliamson Tak, inotifywaitirytuje w ten sposób. Możesz użyć czegoś takiego //%f, ponieważ nazwa pliku nigdy nie będzie zawierać podwójnego ukośnika, o ile ścieżka do obejrzenia nie; wtedy irytacja jest po stronie parsowania.
Gilles „SO- przestań być zły”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.