我有一个脚本可以在指定目录中查找超过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
答案 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扩展)-print0
到find
和-0
到xargs
:
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 {}' \;
尝试看看它是否有效。