让 `xargs` 运行它每次收到的参数而不是每个“-n”参数?

让 `xargs` 运行它每次收到的参数而不是每个“-n”参数?

我正在使用fswatchxargs来监视文件系统更改,并根据正在更改的文件运行命令。 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(超时)选项。readSECONDS

这有点难看,但可以对大约一秒钟内出现的输入进行分组:

#!/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)。它会聚合并组合事件几秒钟,然后生成一个(或多个)进程来同步更改。

相关内容