使用find时转义bourne shell中的basename

时间:2014-08-19 08:22:45

标签: shell find

我想通过sendmail合并三个logwatch输出和管道结果的输出。

示例:

#!/bin/sh
LOG_DIR="/var/log/remote-hosts"
MAIL_TO="me@email.com"

sh -c "logwatch && find ${LOG_DIR} -type d -name \"ip*\" -print0 | xargs -0 -I{} sh -c 'logwatch --logdir {} --hostname $(basename {})'" | 
sed '1!b;s/^/To: '${MAIL_TO}'\nSubject: Logwatch report\n\n/' | sendmail -t

在/ var / log文件夹上执行第一个logwatch 然后我想用find遍历/ var / log / remote-hosts子文件夹(ip-10-0-0-38和ip-10-0-0-39),并对它们进行logwatch。

合并的输出将通过sentmail发送。但是我想用/ var / log / remote-hosts子文件夹的基本名称替换主机名,而不是/ var / log / remote-hosts / ip-10-0-0-38我会有ip-10-0-0仅限-38。

但不幸的是,我不知道如何正确地执行basename部分。有帮助吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

请勿使用sh -c分组语句,请使用(...)

(logwatch && find ${LOG_DIR} -type d -name "ip*" -print0 | xargs -0 -I{} sh -c 'logwatch --logdir {} --hostname $(basename {})') |
    sed '1!b;s/^/To: '${MAIL_TO}'\nSubject: Logwatch report\n\n/' | sendmail -t