Как обнаружить новые файлы в папке с помощью bash- скрипта? Я хотел бы обработать файлы, как только они будут созданы в папке. Возможно ли это сделать или мне нужно запланировать скрипт с cron, который проверяет наличие новых файлов каждую минуту или около того?
shell
filesystems
files
directory
monitoring
ihatetoregister
источник
источник
Ответы:
Вы должны рассмотреть возможность использования
inotifywait
в качестве примера:В Ubuntu
inotifywait
предусмотренinotify-tools
пакет. Начиная с версии 3.13 (текущей в Ubuntu 12.04)inotifywait
имя файла будет отсутствовать без опции -f. Старые версии, возможно, должны быть принуждены. Важно отметить, что эта-e
опцияinotifywait
является лучшим способом фильтрации событий. Кроме того, вашаread
команда может назначить позиционный вывод нескольким переменным, которые вы можете использовать или игнорировать. Нет необходимости использовать grep / sed / awk для предварительной обработки вывода.источник
inotifywait
было именно то, что я хотел.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
Так что вам нужно только сделать,inotifywait -m /path -e create |
я собираюсь попытаться отредактировать этот ответ.fswatch
. Я не писал это, но это с открытым исходным кодом, и я использую его.Я предпочитаю
incron
, так как им легче управлять. По сути это сервис, который использует,inotify
и вы можете настроить конфигурации для выполнения действий, основанных на операциях изменения файлов.Пример:
Вы можете увидеть полный пример здесь: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
источник
Я только что подготовил это, и не вижу никаких больших проблем с этим, кроме крошечного шанса пропустить файлы между проверками.
Если обработка вашего файла не занимает много времени, вы не должны пропустить ни одного нового файла. Вы также можете задокументировать действия ... Это не пуленепробиваемое, но оно служит некоторым целям без внешних инструментов, таких как inotify.
источник
inotify
не доступно. Я бы добавил,-type f
чтобы отфильтровывать только файлы. В противном случае папка также будет возвращена.-f filename
вариант отличный. Тогда единственный оставшийся вопрос - как заставить это начаться после перезагрузки. Я собираюсь использовать это с моей солнечной установкой,os.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
чтобы создание этого файла заставило главный компьютер использоватьespeak
и объявить о низком напряжении. Он уже отправляет мне электронное письмо, но так как моя система уже говорит о времени в верхней части часа, у нее есть все остальное. askubuntu.com/questions/977613/...Вы можете использовать
watch
в своем скриптеМониторинг вашей папки и выводит список всего в ней каждые 0,1 секунды
недостаток
Не в режиме реального времени, поэтому, если файл был создан и удален менее чем за 0,1 секунды, то это не будет работать,
watch
поддерживает только минимум 0,1 секунды.источник
Я предполагаю, что целевая папка (я буду называть ее
isempty
просто для удобства) пуста, и вы ожидаете, чтобы один или несколько файлов были туда сброшены.Вы можете использовать следующую команду:
просто чтобы проверить, пуста ли папка, на самом деле она вернет 0, если нового файла нет (следовательно,
isempty
папка еще пуста), или, с другой стороны, вернет значение больше 0 (на самом деле число файлов в данный момент в папке).Тем не менее, глупый тест if / then может сделать всю работу:
Конечно,
do_something
функция должна будет манипулировать файлом (ами) внутриisempty
папки, а затем удалять его (их) из самой папки после обработки.Добавление в ваш crontab строки, подобной следующей, будет запускать проверку раз в минуту и,
do_something
если конечно, папка не пуста, будет запускаться действие:источник
ls
для сценариев.find
Вместо этого используйте или просто добавьтеЕсли вы хотите обнаружить новые файлы, затем обработайте их и в конце удалите обработанные файлы, которые вы можете использовать systemd.path . Этот метод основан на inotify. Существует опция DirectoryNotEmpty, поэтому systemd может запускать ваш скрипт всегда, когда обнаруживает какие-либо файлы в каталоге. Вы должны помнить, что это будет работать, только если вы можете удалить исходные файлы и скрипт оставит каталог пустым.
Сначала подготовьте файл mymonitor.service
затем перейдите к mymonitor.path, чтобы определить путь
Если имя файла .path совпадает с именем службы, нет необходимости указывать имя службы в файле .path.
Основан на мониторинге доступа к файлам для чайников
источник
entr
Использование
entr
это новый способ сделать это (это кроссплатформенный). Примечаниеentr
не использует опрос, что дает ему огромное преимущество над многими альтернативами.На BSD он использует
pledge(2)
Вы можете установить его с
Вы можете отслеживать каталог для новых дополнений, используя
Варианты объяснения (из документов),
источник
Баш не может сделать это легко. Вам нужно было бы получить список всех файлов в папке, периодически получать новый список и сравнивать их, чтобы увидеть, что изменилось.
То, что вы ищете, называется inotify. Он встроен в ядро Linux, и вы можете сидеть и ждать, пока что-то произойдет, и в этот момент inotify возвращается и говорит: «Привет, есть новый файл с именем foobar».
Чтобы выполнить то, что вы хотите, вам нужно переключиться на что-то вроде Perl и использовать Linux :: Inotify2 (python, вероятно, также поддерживает inotify, но я человек Perl).
источник
Это работает в Cygwin и Linux. Некоторые из предыдущих решений, которые записывают файл, приводят к перегрузке диска. Этот скипетт не имеет этой проблемы:
источник
Ниже приведена сокращенная версия примера стекового потока, который я протестировал и включил в один из моих проектов, который требует мониторинга определенных каталогов.
Вот ссылка на скрипт, который использует модифицированную версию выше для автоматической расшифровки файлов или каталогов, найденных в точке монтирования sshfs; вышеупомянутый проект.
источник