【问题标题】:Rename file using regex (Linux Command line)使用正则表达式重命名文件(Linux 命令行)
【发布时间】:2018-01-10 21:23:19
【问题描述】:

我有一个创建两个文件的备份脚本:

a) db_mywebsite_2018-01-10_00-25.sql.gz

b) mywebsite1_2018-01-10_00-01.tar.gz

我正在寻找一个带有正则表达式的 Linux 命令来重命名两个文件以匹配 db_mywebsite.sql.gz mywebsite1.tar.gz

正则表达式命令需要从文件名中删除日期(20XX-XX-XX_XX-XX)(每天都会不同)。

感谢您的帮助!

【问题讨论】:

  • SO 是针对编程问题,而不是关于使用或配置 Linux 的问题。 SuperUser.com 或 unix.stackexchange.com 会更好地解决此类问题。
  • 看看rename 命令。它允许您提供 perl 样式的 s/old/new/ 表达式来匹配正则表达式并从中生成新名称。
  • 请再次阅读您的问题,看看是否有意义。如果不是,请尽早改写问题。

标签: regex linux shell


【解决方案1】:

如果文件在您的当前目录中,您可以使用:

rename 's/(db_)?(mywebsite([0-9]+)?)_.+\.(tar|sql)\.gz/$1$2.$4.gz/g' *

地点:

  • (db_)? 检查 db_ 的 0 或 1 次出现,存储在捕获的组 1 中
  • (mywebsite([0-9]+)?) 是 mywebsite 的捕获组,后跟任意位数,保存为捕获组 2
  • _.+ 而不是直接搜索日期,而是搜索 _ 后跟任意字符序列。
  • \.(tar|sql)\.gz 允许 .tar.gz 或 .sql.gz 并将 3 个字符序列保存在捕获组 4 中。
  • 输出组合了捕获组 1、2 和 4。

如果在捕获组之后使用任何字符序列导致问题,您可以对日期格式非常严格:

rename 's/(db_)?(mywebsite([0-9]+)?)_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}\.(tar|sql)\.gz/$1$2.$4.gz/g' *

或者搜索数字、连字符和下划线的组合:

(db_)?(mywebsite([0-9]+)?)[0-9_-]+\.(tar|sql)\.gz

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 2018-08-22
    • 2013-08-31
    • 2012-06-21
    • 2012-08-02
    • 2015-04-23
    • 2011-09-14
    • 2017-08-10
    相关资源
    最近更新 更多