我正在使用fswatch
和xargs
来监视文件系统更改,并根据正在更改的文件运行命令。 fswatch
将更改的文件打印到标准输出,并xargs <my command>
从标准输入使用它们。
如果我使用xargs -n1
,我的命令将在每次更改后运行。如果我使用xargs -n100
,我的命令将在发生 100 处更改之前不会运行。我想对 1 秒内发生的所有更改(参数)进行批处理。
如果 xargs 一次在 stdin 上接收 50 行,我希望 xargs 在一次调用中将所有 50 行传递给我的命令,而不是像xargs -n1
.但如果 xargs 每分钟只接收 1 行,我不想在调用命令之前等待 50 分钟;我希望它具有相对的交互性(即最大 1 秒,前提是 xargs 在 stdin 上收到非零数量的参数)。
提前致谢!
答案1
如果您可以使用 Bash,则可以使用, 和/或变量的-t
(超时)选项。read
SECONDS
这有点难看,但可以对大约一秒钟内出现的输入进行分组:
#!/bin/bash
while true; do
values=()
start=$SECONDS
while [ "$SECONDS" -lt $((start + 1)) ]; do
if IFS= read -r -t 1 line; then
values+=("$line")
fi
done
if [ "${#values[@]}" != 0 ]; then
echo got "${values[@]}"
# do something useful with "${values[@]}" here
fi
done
超时read
可以防止它永远阻塞,并且测试可以确保即使在每秒永远获取一次输入的SECONDS
病态情况下,内部循环也会被破坏。read
答案2
使用Lsyncd而不是重新发明轮子;
lsyncd -rsyncssh /home remotehost.org backup-home/
https://github.com/axkibe/lsyncd/blob/master/README.md
Lsyncd 监视本地目录树事件监视器接口(inotify 或fsevents)。它会聚合并组合事件几秒钟,然后生成一个(或多个)进程来同步更改。