按日期查找和复制特定文件
Find and copy specific files by date
我一直在尝试使用脚本将一些文件从一台机器备份到另一台机器,但 运行 遇到了问题。
基本上我想做的是复制两个文件,一个.log 和一个(或多个).dmp。它们的格式始终如下:
something_2022_01_24.log
something_2022_01_24.dmp
我想用这些文件做三件事:
- 找到倒数第二个 .log 文件(即 something_2022_01_24.log 是最新的,我想找到前面那个 something_2022_01_22.log)
- 获取仅包含日期的子字符串 (2022_01_22)
- 复制每个与日期匹配的 .dmp(即 something_2022_01_24.dmp、something01_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}")
我一直在尝试使用脚本将一些文件从一台机器备份到另一台机器,但 运行 遇到了问题。
基本上我想做的是复制两个文件,一个.log 和一个(或多个).dmp。它们的格式始终如下:
something_2022_01_24.log something_2022_01_24.dmp
我想用这些文件做三件事:
- 找到倒数第二个 .log 文件(即 something_2022_01_24.log 是最新的,我想找到前面那个 something_2022_01_22.log)
- 获取仅包含日期的子字符串 (2022_01_22)
- 复制每个与日期匹配的 .dmp(即 something_2022_01_24.dmp、something01_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}")