我正在尝试编写一个脚本来检测何时将文件添加到特定文件夹并使用最后添加的文件名运行命令。我具体想做的是为我在特定文件夹中添加的每个文件创建一个二维码。
所以我需要做的是:检测何时将文件添加到文件夹,获取基本文件名并传递给qrencode -o filename.png mysite/filename.ext
,理想情况下,让它在启动时启动一个 cronjob。
我正在阅读一些有关使用的内容inotify
,但我不确定如何实现这一点。
答案1
您可以使用它inotifywait
来达到期望的结果。
while true
do
inotifywait -r -e create /directory && /bin/bash path/to/your/script
done
使用 在后台运行该脚本nohup
。
答案2
尝试一下 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 $#
创建是在监视的目录中创建文件或目录的事件。
你的脚本是您的脚本的名称,它获取文件并完成所有工作。
$#是触发事件的文件的名称。
在您的情况下,您需要更改文件的扩展名,因此最好创建一些简单的脚本,获取文件并执行所有操作。
类似这样的事情(我试图检查所有内容,但仍然可能包含错误 -使用前手动检查):
#!/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"