【问题标题】:ksh - Comparing today and yesterday file sizeksh - 比较今天和昨天的文件大小
【发布时间】:2015-10-09 16:14:13
【问题描述】:

我需要将今天生成的文件的大小与昨天生成的文件的大小进行比较(每天都会生成一个新文件 - 非常大)

fileA_20150716.log
fileB_20150717.log
fileC_20150718.log
fileD_20150719.log

最好的方法是什么(编码新手)? 我找到了这段代码,但我认为它不适用于闰年等。

prev_date=`TZ=bb24 date +%Y%m%d`
echo $prev_date

【问题讨论】:

  • @NightShadeQueen - 已经看到那个帖子,但我没有使用 PERL
  • Err... ksh 还是 bash?下定决心……
  • @NightShadeQueen - 使用 -- (使用 AIX .. ksh) 是非法的
  • @NightShadeQueen - 我只能使用 KornShell 不能使用任何其他语言

标签: shell unix ksh


【解决方案1】:

您可以从这个 Bash 脚本开始并根据您的需要对其进行扩展:

#!/bin/bash

A=(*.log)

for ((i = 0; i < ${#A[@]} - 1; i++)); do
  diff "${A[i]}" "${A[i + 1]}"
done

它不使用日期,而是比较相邻的日志文件对。您可以将diff 命令替换为更适合您的命令。

【讨论】:

  • 这不是比较文件夹中的每个文件吗?我只需要比较今天和昨天的文件。
  • 它只比较 A[i] 和 A[i + 1] 对。不过,它可能对您来说不够灵活。
【解决方案2】:

我需要将今天生成的文件大小与昨天生成的文件大小进行比较

与其从今天的日期构造昨天的文件的文件名(正如您所发现的那样,这很棘手),为什么不简单地查找具有正确名称(模式)和修改时间的文件昨天的?这要容易得多:

TODAYSSIZE=`find . -name "file*\.log" -daystart -mtime 0 -printf "%s"`
YESTERSIZE=`find . -name "file*\.log" -daystart -mtime 1 -printf "%s"`

然后对值做任何你需要做的事情。

根据您的要求调整搜索路径 (.)、文件名模式 (file*\.log) 和显示的实际大小格式 (%s)。

这是假设你有 GNU find 可用; AIX 附带的find 不支持-printf。不过,您仍然可以使用它来获取文件名:

TODAYSFILE=`find . -name "file*\.log" -daystart -mtime 0`
YESTERFILE=`find . -name "file*\.log" -daystart -mtime 1`

然后以您喜欢的任何方式(ls -s $TODAYSFILE 或其他方式)检索文件大小。

请注意,find 以递归方式工作,即它也会在子目录中找到日志文件。 GNU find 可以告诉-maxdepth 1 来避免这种情况,AIX find 不能。

【讨论】:

  • 七年前我第一次遇到 AIX,当时我继承了一个公司项目,该项目也应该在 AIX 上运行。直到今天,我还没有停止讨厌这个系统的胆量,尤其是因为它的 HODOR 用户空间工具......
  • 感谢您有兴趣帮助我,但系统上无法使用 -maxdepth -daystart 等命令。
  • @SergioM.S.:如果子目录中没有(当前)日志文件,那么缺少-maxdepth 不是问题。很抱歉没有交叉检查 -daystart 和 AIX find,但它确实是一个方便的功能:取决于你的日志文件最后一次被触摸的时间和你的脚本运行的时间(我在这里假设某种 cron-job),你不不需要-daystart,可以单独使用-mtime。由于您没有提供所有相关信息,因此任何答案只能指向一个大致方向,我指向find 作为文件名修补的替代方法。您必须根据自己的需要对其进行调整。
  • 我在想的是,1)查找当前时间前 24 小时的文件(应该返回 1 个文件,因为此脚本运行一次)2)存储找到的文件名 3)将今天的文件与找到的文件进行比较通过find命令你觉得这样行吗?
  • @SergioM.S.:有很多方法可以解决这个问题。 ls -tr file*.log | tail -n 2 例如会给你最后两个日志文件名。修改文件名可能是最复杂和最脆弱的方法。
【解决方案3】:
#!/usr/bin/bash

a=$(date  +%Y%m%d)
b=$(date -d yesterday  +%Y%m%d)

for f in *$a.log
do
    wc $f ; wc ${f/$a/$b}
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多