2

我有这个脚本可以删除 7 天或更早的文件,然后将它们记录到一个文件夹中。它会正确记录并删除所有内容,但是当我打开日志文件进行查看时,它非常草率。

log=$HOME/Deleted/$(date) 
find $HOME/OldLogFiles/ -type f -mtime +7 -delete -print > "$log"

日志文件难以阅读

示例文件输出:(在记事本中打开时)

/home/u0146121/OldLogFiles/file1.txt/home/u0146121/OldLogFiles/file2.txt/home/u0146121/OldLogFiles/file3.txt

反正有没有更好更干净地记录文件?也许与文件名、删除日期以及它的年龄有关?

4

4 回答 4

0

在您的删除脚本中,您可以在顶部添加 2 个变量,我们称它们为“timeDate”和“logDestination”。它们看起来像这样:

timeDate=$(date "+%d/%m/%Y %T")                         
logDestination=/home/$USER/.deleteLog; touch $logDestination

现在 $(date "+%d/%m/%Y %T") 部分只是获取当前日期和时间。它关闭以获取系统日期;日期 (+%d) 然后月份和年份 (%m) (%Y) btw 大写 Y 返回全年,如 YYYY。然后它将该日期和时间存储在变量中以供以后使用。

logDestination 变量为我们保存一个目录或文件路径,指向一个名为 .deleteLog 的文件。现在后面的触摸部分不是完全必要的,但如果文件不存在或被意外删除或重命名,它将使文件存在。

在 bash 脚本和许多编程语言中,人们制作方法或函数,它们只是通常只完成一项工作的简单代码段。下面的这个函数旨在将消息写入日志文件:

##  Logging function
function _logger () {
        echo -e "$timeDate $user - $@\r" >> $log
} 

该功能的简单解释是它能够接收某种形式的信息。如果您查看上面的函数,请注意“$@”符号,如果您愿意,这是一个占位符,它将放置您指向该函数的所有字符串(文本)。这是一个可以接收多个字符串或输入的函数的更精简版本:

function _example () {
    echo -e "$@"
}

要调用这个函数并给它一个消息,我们可以直接输入(脚本中函数下的任何位置):

example "hello"

这个字符串“hello”被赋予函数,函数中的 echo 行将“hello”输出到您的终端或屏幕。echo 行中的 -e 有助于 echo 区分活动部分,最好使用“man echo”来让您了解其行为修改。

所以回到你的脚本。

假设您有一行删除了目录的内容(我建议小心谨慎,不鼓励这样的行,但是嗯)。

完成删除后,您可以调用;

_logger "deletion of file (or  $FILE) successful."

_logger 函数会很好地放置日期时间、消息并为您开始一个新行 (\r)。函数中的 $user 由您当前的视图放置。因为它会说你的用户名。

函数可以多次调用,节省代码重复并使脚本看起来更整洁。

于 2013-06-28T04:26:12.110 回答
0

尝试
log=$HOME/Deleted/$(date);
# 将其更改为 echo -e 并在需要时插入新行
find $HOME/OldLogFiles/ -type f -mtime +7 -exec echo {} \; > "$日志"

于 2013-06-27T21:05:04.157 回答
0

用于logger记录并将实际的日志处理留给sysloglogrotate

于 2013-06-27T20:41:34.940 回答
0

你在这里问一些事情......

为什么我的日志文件在记事本中看起来很有趣?

可能是因为您用来查看它的工具,但如果没有更多信息,很难说。记事本是一个 Windows 应用程序,Windows 使用一种不同于 unix 的策略来结束文本文件中的行。如果您想确定,请使用hexdump或之类的工具od来查看文件中的实际情况。正如评论中所建议的那样,head filename.log在 unix 主机上可能会向您展示您的期望,在这种情况下,您将确认行尾理论。

如果记事本是您的首选工具,那么我们可以向您展示如何转换文件以使其与 Windows 更兼容。否则,让我们知道您真正需要什么。

如何在我的日志中包含这些额外数据?

你要几个项目:

  • 文件名 - 很简单,你已经知道了。
  • 删除日期 - 很简单,您只需要每个条目的时间戳。
  • 文件的年龄 - 更难。文件的时间戳是否足够,或者您是否想要例如从文件本身的第一行提取的日期?如果是后者,您需要在问题中包含一个示例。我现在会选择前者。

首先,bash 版本 4 及更高版本允许您将时间格式用作 a 的一部分printf,因此您可以执行以下操作:

printf -v log '%s/Deleted/%(%F)T' "$HOME"

但老实说,我认为这是一个 hack,而您真正想要的是使用其他工具旋转的单个文本文件。

log=/var/log/whatever.log

“其他工具”将取决于您的操作系统。在 FreeBSD 中,查看/etc/newsyslog.conf. 在 Linux 中,请参阅您的发行版的文档,查找诸如“logrotate”之类的内容。

您的命令的输出find可以是成功删除的文件,但您不必只有文件名。考虑以下:

find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete

在文件被删除之前,它的输出是整ls行。它包括文件的日期和 inode 编号。以时间戳开头,您可能会很高兴:

find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete | sed "s/^/[$(printf '%(%F %T)T')] /"

或者,如果您更愿意在不使用 sed 的情况下执行此操作:

while read line; do
    printf '[%(%F %T)T] %s\n' -1 "$line"
done < <(find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete)

在这个版本中,-1printf 将 解释%T为“现在”。

重定向到$log你喜欢的。

最后,这可能是“最佳”选项,避免完全在 bash 中管理日志文件,logger而是使用系统的命令。POSIX 版本非常简单,但您可以在BSD Linux中控制 syslog 样式。

于 2019-04-09T18:44:58.650 回答