根据文件名中的日期和时间列出文件

根据文件名中的日期和时间列出文件

我想在 UNIX 中自动执行一项任务并制作一个脚本。

有一个目录,每天都会有 2 个文件出现,并且这些文件在晚上 10 点到凌晨 1 点之间的任何时间都会出现。

文件名类似于batm53_20131025_BARC5300001201310240000000200004233.221341696408.

如果您看到文件名由 3 部分组成:

  1. batm53 是常数
  2. 文件到达目录的日期
  3. 这部分是BARC5300001201310170000000200004233.221341696408,其中BAR5300001是常量,然后在文件日期之后。

假设今天是 10 月 24 日,文件在凌晨 1 点之后出现,则文件名的第二部分显示 10 月 25 日,但在 BAR5300001 之后的第三部分显示 10 月 24 日日期 (20131024)。

我在这种情况下面临问题。如果文件在晚上 10 点到凌晨 12 点之间出现,那么我可以借助 find 命令使脚本变得简单,但我在制作该部分时遇到了问题。我如何检查文件是否在上午 12 点之后到达,因为该文件应该是前一个日期,而在上午 12 点之后日期应该更改?

答案1

您可以在凌晨 12 点创建文件“temp”,然后查找较新的文件,然后使用相应的日期重命名这些文件

例如:

步骤1

使用以下命令在上午 12 点或之后创建文件。

$ touch -d "$(date +%F)" temp.file

touch如果您在 2013 年 10 月 26 日运行,则文件日期将为“Oct 26 00:00”。

第2步

如您所愿,将先前的日期设置为文件,然后创建变量以获取先前的日期:

$ Yesterday=$(date +%Y%m%d -d '1 day ago')

笔记:(这将在变量中保存值“20131025”)。

步骤#3

现在您可以找到比temp.file我们创建的文件更新的文件。

$ find . -type f -newer temp.file

好的,您可以随意查看中午 12 点之后创建的文件。现在您想重命名为之前的日期吗?

$ find . -type f -newer temp.file | \
    awk -v y=$Yesterday '{split($0,arr,"_"); \
    print "mv -v --",$0, arr[1]"_"y"_"arr[3]}'

上面的命令只会打印输出,其中第一个文件是原始文件名,第二个文件是您想要的。

如果您认为输出看起来不错,那么只需附加| sh到相同的命令

$ find . -type f -newer temp.file | \
    awk -v y=$Yesterday '{split($0,arr,"_"); \
    print "mv -v --",$0, arr[1]"_"y"_"arr[3]}' | sh

这将在第二部分中使用先前的日期重命名文件。因此,您可以在上述命令的帮助下创建脚本,然后使用 cron 在 12 点后运行。

相关内容