打印shell查找和删除命令到屏幕和日志文件

时间:2016-06-13 14:36:26

标签: shell

我有一个脚本可以在指定目录中查找超过x天的日志文件并删除它们。

find $LOG_ARCHIVE/* -mtime +$DAYS_TO_KEEP_LOGS -exec rm -f {} \;

这是按预期工作但我想有选项将处理打印到屏幕和日志文件,所以我知道哪些文件(如果有)已被删除。我尝试在最后添加tee,但没有成功。

find $LOG_ARCHIVE/* -mtime +$DAYS_TO_KEEP_LOGS -exec rm -fv {} \; | tee -a $LOG

2 个答案:

答案 0 :(得分:1)

可以通过多种方式完成任务。

一种可能性是简单地运行find两次:

find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print > "$LOG"
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec rm -f {} +

另一种可能性是使用tee和(GNU扩展)-print0find-0xargs

find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print0 |
tee "$LOG" |
xargs -0 rm -f

使用此版本,日志文件将在每个文件名的末尾具有空字节。如果您不注意可能的含糊不清,可以安排用换行符替换:

find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print0 |
tee >(tr '\0' '\n' >"$LOG") |
xargs -0 rm -f

这使用Bash(和Korn shell)process substitution通过tr传递日志文件,将空字节'\0'映射到换行符'\n'

另一种方法是编写一个小的自定义脚本(称之为remove-log.sh):

printf '%s\n' "$@" >> "$LOG"
rm -f "$@"

然后使用:

find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec bash remove-log.sh {} +

请注意,脚本需要查看$LOG的值,因此必须将其导出为环境变量。您可以通过明确传递日志名称来避免这种情况:

logfile="$1"
shift
printf '%s\n' "$@" >> "$logfile"
rm -f "$@"

加:

find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec bash remove-log.sh "$LOG" {} +

请注意,这两个都使用>>来追加,因为脚本可能被多次调用(虽然它可能不会被激活)。在运行find命令之前,您需要确保日志文件为空。

请注意,我从/*的路径参数中删除了find;它并不是真的需要。您可能希望添加-type f以确保仅删除文件。 +是POSIX 2008规范find中的一项功能,它使find更像xargs,而无需明确使用xargs

答案 1 :(得分:0)

find $LOG_ARCHIVE/* -mtime +$DAYS_TO_KEEP_LOGS -exec sh -c 'echo {} |tee -a "$LOG"; rm -f {}' \;

尝试看看它是否有效。