bash-скрипт для определения, когда файл добавляется в папку и команда exec
Я пытаюсь написать сценарий для обнаружения, когда файл добавляется в определенную папку, и выполнить команду, используя имя последнего добавленного файла. Я специально пытаюсь создать QR-код для каждого файла, который я добавляю в определенную папку.
Так что мне нужно сделать: определить, когда файл добавлен в папку, получить базовое имя файла и перейти к qrencode -o filename.png mysite/filename.ext
и, в идеале, иметь cronjob, который начинается при загрузке.
Я читал что-то об использовании inotify
, но я не уверен, как это сделать.
2 ответа
Ты можешь использовать inotifywait
достичь желаемого результата.
while true
do
inotifywait -r -e create /directory && /bin/bash path/to/your/script
done
Запустите этот скрипт в фоновом режиме с nohup
,
Попробуйте 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 - это событие создания файла или каталога в наблюдаемом каталоге.
your_script - это имя вашего скрипта, который принимает файл и выполняет всю работу.
$ # - это имя файла, который вызвал событие.
В вашем случае вам нужно изменить расширение файла, поэтому лучше создать какой-нибудь простой скрипт, который принимает файл и выполняет все действия.
Что-то в этом роде (я пытался проверить все, но все равно может содержать ошибки - проверьте вручную перед использованием):
#!/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"