Подтвердить что ты не робот

Inotify и bash

Я пытаюсь сделать bash script с помощью инструментов inotify, которые будут отслеживать каталог и изменять все новые файлы, удаляя строки, содержащие "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

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

4b9b3361

Ответ 1

По умолчанию вывод текста из 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 Как отмечено в комментарии Daan, 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.

Ответ 2

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

filename eventlist [eventfilename]

Если ваши имена файлов могут содержать пробелы и запятые, это становится сложным для синтаксического анализа. Если он содержит только имена "sane", вы можете сделать следующее:

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

Ответ 3

Цитата man-страницы 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.

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