【问题标题】:Find and copy specific files by date按日期查找和复制特定文件
【发布时间】:2022-01-26 23:39:14
【问题描述】:

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

基本上我想要做的是复制两个文件,一个.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/

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

谢谢!

【问题讨论】:

    标签: linux bash shell directory


    【解决方案1】:

    请您尝试以下方法:

    #!/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 命令将完成这项工作。请谨慎 不要在双引号中包含通配符*,以便 通配符已正确扩展。

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

    sed:

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

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

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

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

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

    【讨论】:

    • 非常感谢您的回复,这正是我所需要的。我稍微调整了代码,它工作得很好!非常感谢!
    • 感谢您的及时反馈。很高兴知道它有效。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2021-05-25
    相关资源
    最近更新 更多