代码之家  ›  专栏  ›  技术社区  ›  Dmitry Shvetsov

带有排除模式的Azure CLI存储删除批处理

  •  1
  • Dmitry Shvetsov  · 技术社区  · 6 年前

    考虑以下blob(或任何存储数据)列表:

    backup-2018-08-29-0000.archive
    backup-2018-08-29-0100.archive
    backup-2018-08-29-0200.archive
    backup-2018-08-29-0300.archive
    backup-2018-08-29-0400.archive
    backup-2018-08-29-0500.archive
    backup-2018-08-29-0600.archive
    backup-2018-08-29-0700.archive
    backup-2018-08-29-0800.archive
    backup-2018-08-29-0900.archive
    backup-2018-08-29-1000.archive
    backup-2018-08-29-1100.archive
    backup-2018-08-29-1200.archive
    backup-2018-08-29-1300.archive
    backup-2018-08-29-1400.archive
    backup-2018-08-29-1500.archive
    backup-2018-08-29-1600.archive
    backup-2018-08-29-1700.archive
    backup-2018-08-29-1800.archive
    backup-2018-08-29-1900.archive
    backup-2018-08-29-2000.archive
    backup-2018-08-29-2100.archive
    backup-2018-08-29-2200.archive
    backup-2018-08-29-2300.archive
    

    我想删除除一个以外的所有文件。所以我最初的想法是 --图案

    --图案

    用于在源中全局化文件或blob的模式。这个

    source

    但我找不到关于“*”,“?”的信息、“[seq]”和“[!”!顺序]'工作。

    backup-2018-08-29-0000.archive ?

    $ az storage blob delete-batch --source mycontainer --pattern <pattern>
    

    更新

    另外一个问题是,我在一年多的时间里收集了大约10000个备份。使用非批处理操作似乎不切实际。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Martin Brandl    6 年前

    我怀疑是否有一种简单的方法可以使用通配符(使用regex会很容易)。 [seq] [!seq] 工作原理如下:

    --pattern backup-2018-08-29-[01]???.archive
    

    将删除第一个数字后面的所有文件 29- 或者 0 1 :

    backup-2018-08-29-0000.archive
    backup-2018-08-29-0100.archive
    backup-2018-08-29-0200.archive
    backup-2018-08-29-0300.archive
    backup-2018-08-29-0400.archive
    backup-2018-08-29-0500.archive
    backup-2018-08-29-0600.archive
    backup-2018-08-29-0700.archive
    backup-2018-08-29-0800.archive
    backup-2018-08-29-0900.archive
    backup-2018-08-29-1000.archive
    backup-2018-08-29-1100.archive
    backup-2018-08-29-1200.archive
    backup-2018-08-29-1300.archive
    backup-2018-08-29-1400.archive
    backup-2018-08-29-1500.archive
    backup-2018-08-29-1600.archive
    backup-2018-08-29-1700.archive
    backup-2018-08-29-1800.archive
    backup-2018-08-29-1900.archive
    

    [!只是否定了这一点:

    --pattern backup-2018-08-29-[!01]???.archive
    

    这将删除:

    backup-2018-08-29-2000.archive
    backup-2018-08-29-2100.archive
    backup-2018-08-29-2200.archive
    backup-2018-08-29-2300.archive
    

    回答你的问题。我会将blob重命名(复制)为backup-保留.存档然后使用 backup-2018-08-29-????.archive

        2
  •  1
  •   Joy Wang    6 年前

    你可以用 Acquire lease blob的(在门户或使用中) az storage blob lease acquire ),然后使用命令 az storage blob delete-batch 删除其他blob。如果您租用该blob,则无法删除该blob,如果您要删除它,只需在门户中中断租用或使用 az storage blob lease break

    我的测试命令(我用15秒指定租约的持续时间):

    az storage blob lease acquire --blob-name "azureProfile.txt"--container-name "testdel" --account-key "accountkey" --account-name "storagename" --lease-duration "15"
    az storage blob delete-batch --source "testdel" --account-key "accountkey" --account-name "storagename"
    

    enter image description here

    签入门户:

    enter image description here

        3
  •  0
  •   Dmitry Shvetsov    6 年前

    我通过执行两个批删除命令解决了这个问题:

    #!/bin/bash
    
    set -e
    
    # AZURE_CONNECTION_STRING has taken from env
    CONTAINER=backups
    DATES="201[78]-??-??"
    
    # delete blobs with a range of 1000-2300 timestamps    
    az storage blob delete-batch \
      --connection-string $AZURE_CONNECTION_STRING \
      --source $CONTAINER \
      --pattern "$DATES-[1-2][0-9]00-link-fs-mongo.archive"
    
    # delete blobs with a range of 0100-0900 timestamps
    az storage blob delete-batch \
      --connection-string $AZURE_CONNECTION_STRING \
      --source $CONTAINER \
      --pattern "$DATES-0[1-9]00-link-fs-mongo.archive"
    

    在这个脚本中,我将删除所有备份,不包括午夜进行的备份(使用 0000