我需要监视一个共享文件夹,在这种特定情况下,主机是 Windows,来宾是 Ubuntu Linux,以查看新文件或已更改的文件。理想情况下,该解决方案应独立于主机或将文件放入共享目录的计算机而工作。新文件将作为不同进程的输入。
如果文件是由主机创建并放入共享文件夹中,inotifywait 工具集不会检测新文件。
我有什么选择?
答案1
您需要轮询文件更改的东西,因为如果文件在 Windows 端被修改,Linux 内核将不会知道它。有一些现有的应用程序可以帮助解决这个问题,例如 Guard:http://guardgem.org/
根据您的具体需要,您可以只watch
列出文件(将 n 秒调整为合适的值):
watch --differences -n 10 ls -l </path/to/shared/dir>
答案2
您也许可以使用早于日期的投票工具之一通知和inotify:加明或者家族,以及类似的东西文件已更改这是一个inotifywait
类似 CLI 的工具。 gamin 和 fam 项目是相关的,并且都相当古老(尽管 gamin 稍微不那么古老)。
对于我使用过的简单且便携的任务像这样的东西通过计划任务:
if mkdir /var/lock/mylock; then
( cd /mnt/mypath; find . -type f -mmin +2 ) | myprocess
rmdir /var/lock/mylock
else
logger -p local0.notice "mylock found, skipping run"
fi
这使用原始锁定和 GNUfind
条件来仅查找文件较老的不到两分钟,我就可以确定文件已完全写入。就我而言,myprocess
文件rsync --remove-source-files --files-from=-
一旦被处理就会被删除。
这种方法还允许您使用//find -print0
来处理麻烦的文件名。xargs -0
rsync -0
如果您必须将所有(旧的和新的)文件保留在同一目录层次结构中,那么构建目录列表快照并比较它们可能也适合您:
if mkdir /var/lock/mylock; then
(
export LC_COLLATE=C # for sort
cd /mnt/mypath
find . -type f -a \! -name ".dirlist.*" -printf '%p\0' |
while read -d '' file; do
printf "%q\n" "${file}"
done > .dirlist.new
[[ -f .dirlist.old ]] && {
comm -13 <(sort .dirlist.old) <(sort .dirlist.new) |
while read -r file; do
myprocess "${file}"
done
}
mv .dirlist.new .dirlist.new
)
rmdir /var/lock/mylock
else
logger -p local0.notice "mylock found, skipping run"
fi
这个bash
脚本:
- 用于
find -printf
打印 \0 (nul) 分隔的文件列表 - 用于
read -d ''
处理该列表,并printf %q
在必要时转义文件名 - 比较新的和以前的 .dirlist 文件
- 调用
myprocess
每个新文件(安全引用)
(还处理修改的文件需要稍微多一些努力,可以使用双行格式find ... -printf '%p\0%s %Ts\0'
,并对while
循环进行相关更改。)
答案3
如果您熟悉node.js及其生态系统,您可以使用这个图书馆 对共享文件夹实施轮询。