Ответ 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.