BASH如何用时间戳保存rm的输出?

BASH如何用时间戳保存rm的输出?

我几乎已经完成了这个工作,这是一个将在 CRON 中运行的脚本,以保留最新的 10 个备份,并删除其他任何内容,我想记录它以跟踪以确保一切都井然有序,我让它工作并编写删除了哪些文件,可惜我无法设置时间戳的前缀。

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
echo "$TIMESTAMP, " | ls -1tr | head -n -10 | xargs -d '\n' rm -f -v >> $LOGFILE

答案1

您可以使用ts以下命令:

ts [-r] [-i | -s] [format]

像下面这样:

TS_FORMAT="%d-%m-%Y-%H-%M-%S, "
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | ts "${TS_FORMAT}" >> $LOGFILE

ts包含在moreutils包裹。

更新:无需安装更多依赖项

您可以xargs再次使用:

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | xargs -L 1 -d '\n' echo "${TIMESTAMP}, " >> $LOGFILE

另一种可能性是使用sed

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | sed "s/^/${TIMESTAMP}/" >> $LOGFILE

使用awk

LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | awk '{ print strftime("%d-%m-%Y-%H-%M-%S"), $0}' >> $LOGFILE

等等。

答案2

我想建议一种基于循环的方法来解决这个问题(尽管我们都喜欢单行代码),但这也更易于阅读。当然,在 CRON 中,只需调用此脚本文件,而不是直接在那里执行代码:

strings=`ls -1tr | head -n -10`
for file in $strings; do
      rmOutput=`rm -f -v $file`
      echo `date +%d-%m-%Y-%M-%S`: $rmOutput >> $LOGFILE
 done

相关内容