按日期查找和复制特定文件

Find and copy specific files by date

我一直在尝试使用脚本将一些文件从一台机器备份到另一台机器,但 运行 遇到了问题。

基本上我想做的是复制两个文件,一个.log 和一个(或多个).dmp。它们的格式始终如下:

something_2022_01_24.log something_2022_01_24.dmp

我想用这些文件做三件事:

对于我能找到的第一个,最好的方法是:ls -t *.log | head-2,因为它显示倒数第二个创建的文件。

至于第二个我比较迷茫,因为我不确定如何解析第一个命令的输出。

我认为我可以用类似的东西处理第三个:

[ -f "/var/www/my_folder/*$capturedate.dmp" ] && cp "/var/www/my_folder/*$capturedate.dmp" /tmp/

你们认为有什么办法可以做到这一点?如何比较子字符串?

谢谢!

请您尝试以下操作:

#!/bin/bash

dir="/var/www/my_folder"

second=$(ls -t "$dir/"*.log | head -n 2 | tail -n 1)
if [[ $second =~ .*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log ]]; then
    capturedate=${BASH_REMATCH[1]}
    cp -p "$dir/"*"$capturedate".dmp /tmp
fi
  • second=$(ls -t "$dir"/*.log | head -n 2 | tail -n 1) 将选择 倒数第二个日志文件。请注意,它假定时间戳 该文件自创建以来未被修改,并且文件名 不包含换行符等特殊字符。这是一个 简单 解决方案,我们可能需要更多改进以提高稳健性。
  • 正则表达式 .*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log 将匹配日志 文件名。它提取日期子字符串(用括号括起来)并分配给 bash 变量 ${BASH_REMATCH[1]} 到它。
  • 然后下一个 cp 命令将完成这项工作。请注意 不要在双引号内包含 widlcard * 这样 通配符已正确扩展。

仅供参考,这里有一些提取日期字符串的替代方法。

sed:

capturedate=$(sed -E 's/.*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log//' <<< "$second")

带参数扩展bash(如果something不包含下划线):

capturedate=${second%.log}
capturedate=${capturedate#*_}

cut命令(如果something不包含下划线):

capturedate=$(cut -d_ -f2,3,4 <<< "${second%.log}")