如何在find的-exec参数中组合两个命令?

时间:2016-10-20 08:03:28

标签: bash grep find exec xargs

我有这个find命令来获取在过去50秒内修改的所有文件,这些文件与最后1000个字符中的以下正则表达式hell\d匹配。 我使用tail来获取最后1000个字符以加快搜索速度,因为要检查的文件很大(平均3GB)。

find /home/ouhma -newermt '50 seconds' -type f |
while read fic; do
    if tail -c 1000 "${fic}" | LANG=C LC_ALL=C grep -Pq 'hell\d'; then
        echo "${fic}"
    fi
done

使用-exec参数替换那个丑陋的循环并更快地检索结果是可行的吗?

这有效,但我不知道它是否是最好的方法:

find /home/ouhma -newermt '50 seconds' -type f -exec bash -c 'LANG=C LC_ALL=C grep -Pq "hell\d" <(tail -c 1000 "{}") && echo "{}"' \;

1 个答案:

答案 0 :(得分:1)

多个-exec操作可以相互关联,如果前一个-exec成功,则将运行一个-exec,即-exec运行的命令将返回退出状态0。

执行:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \
       bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1")' _ {} \; -exec echo {} \;

由于您只是打印文件名,这就足够了:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \
       bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1") && echo "$1"' _ {} \;