Я надеюсь, что этого примера будет достаточно для того, чтобы вы повысили его для своего варианта использования. Ура!

у использовать inotifyway для мониторинга вновь созданного или перемещенного файла в папке, но только файлы.

Допустим, моя папка называется «watched_folder_test», и у меня есть имя файла «toto.txt». Если я использую команду mv для перемещения файла в watched_folder_test, я получаю уведомление, что хочу

Допустим, внутри watched_folder_test у меня есть папка с именем foo, и я создаю имя файла 'bar.txt ". Я получил уведомление, которое я хочу.

Но вот моя проблема. Если у меня есть имя папки foo за пределами watched_folder_test, и у меня есть имя файла bar.txt внутри него (foo / bar.txt), и я перемещаю всю эту папку внутри watched_folder_test. Я получаю только уведомление о создании foo! Ничего о bar.txt. Тем не менее, меня не волнует foo, я хочу знать только о "bar.txt"

вот мой код пока

#!/bin/bash                                                                                          

inotifywait -mr /home/romain/depot/watched_folder_test -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        for ac in $action
        do
            isdir=`echo $ac | grep 'ISDIR'`
            if [ $? == 0 ]
            then
                echo "It's a folder"
            else
                echo "It's a file"
            fi
        done
    done

Как я могу получать уведомления о каждом файле, находящемся во вновь перемещенной папке, вместо создания самой папки?

 Romain16 нояб. 2017 г., 11:06
Я попробовал incron до iotifywait, но не смог его использовать. Также я в конечном итоге вручную получить файл в директории, когда директория перемещена или создана. И я переключаюсь на версию inotify на python. Спасибо за отзыв, хотя
 Basile Starynkevitch10 нояб. 2017 г., 15:36
отфильтровать уведомление, используяstat; рассмотреть возможность использованияincron

Ответы на вопрос(1)

inotifytools который включаетinotifywait, Я бы посоветовал пользователям проявлять предельную осторожность при использовании, потому что это абсолютно ошибочно, когда речь идет о рекурсивном просмотре перемещенных (из и в) каталогов.

Просто чтобы донести мою мысль, давайте рассмотрим соответствующую ситуацию, которая у вас сейчас есть; Дир движется. Скажем, мы смотрим / foo / bar:

Наmv /foo/bar /choo/tarдаже после переезда (переименовать?)/foo/bar в/choo/tar, он будет продолжать сообщать о событиях на/choo/tar как/foo/bar ошибочно. Это неприемлемо! Он не должен продолжать смотреть каталог, который был перемещен из корневого пути наблюдения. И, что еще хуже, он продолжает сообщать об этом устаревшим путем, которого не существует.

Кроме того, почемуmove событие сообщается какcreate? Возмутительно!move полностью отличается отcreate!move этоmove, это должно быть сообщено какmove, Обидно чтоinotifytools пользуется огромной популярностью, а ничего не подозревающие пользователи не знают о его заблуждениях.

Теперь, когда я избавился от разочарования (что актуально), давайте поможем исправить вашу ситуацию.

бегатьпушистый: Терминал 1

[email protected]:/home/lab/fluffy# fluffy | \
while read events path; do \
 if ! echo $events | grep -qie "ISDIR"; then \
  echo "$events $path"; \
 fi
done

Воспроизведите вашу ситуацию: терминал 2

[email protected]:/tmp# pwd
/tmp
[email protected]:/tmp# mkdir test
[email protected]:/tmp/test# ls -l
total 0
[email protected]:/tmp/test# mkdir -p d1/dd1
[email protected]:/tmp/test# echo "This file will be moved" | cat >> d1/dd1/f1
[email protected]:/tmp/test# mkdir -p d2/
[email protected]:/tmp/test# ls -l d2
total 0
[email protected]:/tmp/test# fluffyctl -w ./d2

[email protected]:/tmp/test# mv d1 d2/
[email protected]:/tmp/test# ls -lR d1
ls: cannot access d1: No such file or directory
[email protected]:/tmp/test# ls -lR d2
d2:
total 4
drwxr-xr-x 3 root root 4096 Mar 18 20:03 d1

d2/d1:
total 4
drwxr-xr-x 2 root root 4096 Mar 18 20:04 dd1

d2/d1/dd1:
total 4
-rw-r--r-- 1 root root 24 Mar 18 20:04 f1

[email protected]:/tmp/test# echo "Events will be produced on this moved file" | cat >> d2/d1/dd1/f1
[email protected]:/tmp/test# cat d2/d1/dd1/f1
This file will be moved
Events will be produced on this moved file
[email protected]:/tmp/test# echo "New files are also watched in the moved dir" | cat >> d2/d1/dd1/f2
[email protected]:/tmp/test# cat d2/d1/dd1/f2
New files are also watched in the moved dir
[email protected]:/tmp/test# fluffyctl -I d2
[email protected]:/tmp/test# fluffy exit

Журнал событий: Терминал 1

[email protected]:/home/lab/fluffy# fluffy | \
> while read events path; do \
>  if ! echo $events | grep -qie "ISDIR"; then \
>   echo "$events $path"; \
>  fi
> done

OPEN, /tmp/test/d2/d1/dd1/f1
MODIFY, /tmp/test/d2/d1/dd1/f1
CLOSE_WRITE, /tmp/test/d2/d1/dd1/f1
OPEN, /tmp/test/d2/d1/dd1/f1
ACCESS, /tmp/test/d2/d1/dd1/f1
CLOSE_NOWRITE, /tmp/test/d2/d1/dd1/f1
CREATE, /tmp/test/d2/d1/dd1/f2
OPEN, /tmp/test/d2/d1/dd1/f2
MODIFY, /tmp/test/d2/d1/dd1/f2
CLOSE_WRITE, /tmp/test/d2/d1/dd1/f2
OPEN, /tmp/test/d2/d1/dd1/f2
ACCESS, /tmp/test/d2/d1/dd1/f2
CLOSE_NOWRITE, /tmp/test/d2/d1/dd1/f2
IGNORED,ROOT_IGNORED,WATCH_EMPTY, /tmp/test/d2
IGNORED, /tmp/test/d2/d1
[email protected]:/home/lab/fluffy# 

В отличие от inotifytools,fluffy верно сообщает о событиях!

Я надеюсь, что этого примера будет достаточно для того, чтобы вы повысили его для своего варианта использования. Ура!

Ваш ответ на вопрос