Назад | Перейти на главную страницу

bash-скрипт для определения момента добавления файла в папку и команду exec

Я пытаюсь написать сценарий, чтобы определять, когда файл добавляется в определенную папку, и запускать команду, используя имя последнего добавленного файла. Я специально пытаюсь создать QR-код для каждого файла, который я добавляю в определенную папку.

Итак, что мне нужно сделать, это: определить, когда файл добавлен в папку, взять базовое имя файла и перейти к qrencode -o filename.png mysite/filename.ext, а в идеале - задание cron, которое запускается при загрузке.

Я читал что-то об использовании inotify, но я не знаю, как это сделать.

Попробуйте incron. Он доступен в большинстве дистрибутивов через одноименный пакет. Я буду использовать Debian и CentOS в качестве примеров, поскольку они охватывают почти все случаи.

Шаги такие:

1) Установите incron

# For Debian
apt-get install incron
# For CentOS
yum install incron

В CentOS вам также нужно будет вручную запустить и включить его.

# For CentOS6
chkconfig incrond on
service incrond start
# For CentOS7
systemctl enable incrond.service
systemctl start incrond.service

2) Добавьте своего пользователя в разрешенный файл /etc/incron.allow (просто добавьте имя пользователя)

3) Добавьте правило incrontab с помощью команды incrontab -e

Правило было бы таким:

/full/path/to/your/directory/ IN_CREATE your_script $#

IN_CREATE - событие создания файла или каталога в наблюдаемом каталоге.

ваш_скрипт это имя вашего скрипта, который принимает файл и выполняет всю работу.

$ # - имя файла, вызвавшего событие.

В вашем случае вам нужно изменить расширение файла, поэтому лучше создать какой-нибудь простой скрипт, который берет файл и выполняет все действия.

Как то так (все пробовал проверить, но все равно могут быть ошибки - проверьте вручную перед использованием):

#!/bin/bash
# Setting constants
output_extension='.png'
path_to_save_files='/full/path/to/needed/folder/'

# Using quotes and $@ to catch files with whitespaces
input_file="$@"

# Verifying input extension
[[ "$input_file" =~ ".*\.txt" ]] || exit 

# Cutting everything from the start to last '/' appeared
input_name=${input_file##/*/}

# Cutting everything from the end to first '.' appeared
short_name="${input_name%.*}"

# Creating full name for output file
output_name="${short_name}${output_extension}"

# Creating full path for your output file
output_file="${path_to_save_files}${output_name}"

# Performing your command at last
qrencode -o "$output_file" "$input_file" 

Ты можешь использовать inotifywait для достижения желаемого результата.

while true
do
inotifywait -r -e create /directory && /bin/bash path/to/your/script
done

Запустите этот скрипт в фоновом режиме с nohup.