Inotify и Bash - PullRequest
       23

Inotify и Bash

24 голосов
/ 25 сентября 2011

Я пытаюсь создать bash-скрипт с inotify-tools, который будет контролировать каталог и изменять все новые файлы, удаляя строки, содержащие «EE». После изменения он переместит файлы в другой каталог

    #!/bin/sh
    while inotifywait -e create /home/inventory/initcsv; do
      sed '/^\"EE/d' Filein > fileout #how to capture File name?
      mv fileout /home/inventory/csvstorage
    fi
    done

Пожалуйста, помогите?

Ответы [ 3 ]

22 голосов
/ 25 сентября 2011

По умолчанию текстовый вывод из inotifywait -e CREATE имеет форму

     watched_filename CREATE event_filename

, где watched_filename представляет /home/inventory/initcsv, а event_filename представляет имя нового файла.

Итак, вместо вашей while inotifywait -e ... строки поставьте:

    DIR=/home/inventory/initcsv
    while RES=$(inotifywait -e create $DIR); do
        F=${RES#?*CREATE }

и в своей строке sed используйте $F в качестве имени Filein. Обратите внимание, что конструкция $(...) является posix-совместимой формой подстановки процесса (часто выполняемой с использованием обратных кавычек), а результат ${RES#pattern} равен $RES с удалением кратчайшего префикса соответствия шаблону. Обратите внимание, что последний символ шаблона является пустым. [см. Обновление 2]

Обновление 1 Для обработки имен файлов, которые могут содержать пробелы, в строке sed используйте "$F" вместо $F. То есть используйте двойные кавычки вокруг ссылки на значение F.

Определения RES=... и F=... не должны использовать двойные кавычки, но их можно использовать, если хотите; например: F=${RES#?*CREATE } и F="${RES#?*CREATE }" оба будут работать нормально при обработке имен файлов, содержащих пробелы.

Обновление 2 Как отмечено в комментарии Даана, inotifywait имеет параметр --format, который управляет формой его вывода. С командой

while RES=$(inotifywait -e create $DIR --format %f .)
   do echo RES is $RES at `date`; done

работает в одном терминале и команда

touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa

работает в другом терминале, следующий вывод появился в первом терминале:

Setting up watches.
Watches established.
RES is a at Tue Dec 31 11:37:20 MST 2013
Setting up watches.
Watches established.
RES is aaa at Tue Dec 31 11:37:21 MST 2013
Setting up watches.
Watches established.
RES is aaaa at Tue Dec 31 11:37:22 MST 2013
Setting up watches.
Watches established.
11 голосов
/ 25 сентября 2011

Вывод из inotifywait имеет вид:

filename eventlist [eventfilename]

Если имена ваших файлов могут содержать пробелы и запятые, это будет сложно проанализировать. Если он содержит только «нормальные» имена файлов, вы можете сделать:

srcdir=/home/inventory/initcsv
tgtdir=/home/inventory/csvstorage
inotifywait -m -e create "$directory" |
while read filename eventlist eventfile
do
    sed '/^"EE/d'/' "$srcdir/$eventfile" > "$tgtdir/$eventfile" &&
    rm -f "$srcdir/$eventfile
done
1 голос
/ 25 сентября 2011

Цитирование справочной страницы inotifywait:

inotifywait will output diagnostic information on standard error and event information  on
   standard  output.  The event output can be configured, but by default it consists of lines
   of the following form:

   watched_filename EVENT_NAMES event_filename

   watched_filename
          is the name of the file on which the event occurred.  If the file is a directory, a
          trailing slash is output.

Другими словами, он выводит имена файлов на стандартный вывод. Таким образом, вам нужно прочитать их со стандартного вывода и работать с ними, чтобы делать то, что вы хотите сделать.

...