我想在 UNIX 中自动执行一项任务并制作一个脚本。
有一个目录,每天都会有 2 个文件出现,并且这些文件在晚上 10 点到凌晨 1 点之间的任何时间都会出现。
文件名类似于batm53_20131025_BARC5300001201310240000000200004233.221341696408
.
如果您看到文件名由 3 部分组成:
- batm53 是常数
- 文件到达目录的日期
- 这部分是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 点后运行。