【问题标题】:Shell script to automatically unzip latest DB file用于自动解压缩最新数据库文件的 Shell 脚本
【发布时间】:2021-12-29 18:57:30
【问题描述】:

我有一个文件夹,用于存储新版本的压缩数据库文件。数据库的每个新版本都有一个文件名约定,表明它是何时创建的。当需要恢复数据库时,它始终是文件夹中的最新版本。以下是 sh 文件的内容:

# Path to the Zip file
  filename="/Users/Documents/development/code/docker/data/2021_10_30__17_37_36.filename_db_backup_sql.qz"
    
    # Restore
    gunzip < $filename | docker exec -i database /usr/bin/mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE

我想要的是 shell 脚本自动加载最新的数据库,而不必每次都用新的文件名更新 shell 脚本本身。

我希望脚本查看文件夹中的所有文件,解析文件名并识别最新的文件并自动加载。

文件名格式为: YYYY_MM_DD__HH_MM_SS.filename_db_backup_sql.qz

编写 shell 脚本不是我的强项,因此我们将不胜感激。

【问题讨论】:

    标签: shell sh


    【解决方案1】:

    最简单的方法是使用find 来查找最近创建的日期,
    文件类型使用-name

    filename=$(find /Users/Documents/development/code/docker/data -type f -name '*.qz' -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1)
    
    echo $filename
    
    gunzip < $filename | docker exec -i database /usr/bin/mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE
    

    find: 显然是在 /Users/Documents/development/code/docker/data 中寻找文件

    -type f: 寻找文件,而不是目录

    -name '*.qz' 查找任何带有.qz 扩展名的文件

    -printf: 格式->

    %T@ %p\n:: 格式文件的最后访问时间

    sort -n:数字排序

    cut:删除空格' '分隔符1637259734.8637336000 2021_10_30__17_37_36.filename_db_backup_sql.qz处的格式化日期

    tail -n 1:输出单个结果

    【讨论】:

    • 我收到了一些有关此代码的错误消息。如果我从上面按原样使用它,我会收到以下错误消息:test.sh: line 26: $filename: ambiguous redirect 其中第 26 行是 gunzip 语句。如果我将该行注释为仅回显 $filename,则会收到此错误消息:find: -printf: unknown primary or operator。关于如何解决的任何想法?
    • 您使用的是什么操作系统?我在 Ubuntu 和 CentO 上都试过了——它们都按预期运行。
    • 如果您使用的是 Mac OS 。参数可能与我给您的参数不匹配。如果是 MacOS -- 尝试发出命令 bash script.sh,因为 bash 是 Mac 的主要 CLI 工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多