【问题标题】:Azure CLI - Copy files from one container prefix to anotherAzure CLI - 将文件从一个容器前缀复制到另一个
【发布时间】:2019-09-19 00:01:33
【问题描述】:

我有存储帐户“mysa”和容器“mycontainer”。在此容器内有两个前缀(“4.1.2.3”和“latest”),其下有文件。我正在尝试将文件从“4.1.2.3”前缀复制到“最新”:

az storage blob copy start-batch --source-container "mycontainer" --pattern "4.1.2.3/*" --destination-container "mycontainer/latest" --account-name mysa

实际结构变为
__ 我的容器
______ 4.1.2.3
______ 最新
_________ 4.1.2.3

如何使用 Azure CLI 正确地将文件从一个前缀移动到另一个前缀?

【问题讨论】:

  • 您是否尝试将 blob 从 4.1.2.3 文件夹复制到 latest 文件夹?例如,如果4.1.2.3 下有一个名为1.png 的文件,您希望将该文件复制到latest 文件夹中,这样路径就会变为latest\1.png
  • @Gaurav Mantri 完全正确!
  • 您喜欢使用 AzCopy 吗?这很容易做到。
  • @NancyXiong 不,我正在尝试配置 azure devops 管道,没有 azcopy 作业,但有 azure cli。
  • @VadzimDvorak 您是否设法解决了这个问题?我已经尝试将子路径移动到源容器中,所以在你的情况下 --source-container "mycontainer/4.1.2.3",但这似乎破坏了在模式中使用通配符的能力(如果你定义文件,它就可以工作, 但 * 不起作用)

标签: azure azure-storage azure-cli


【解决方案1】:

没有直接的方法可以将文件从一个容器前缀复制到另一个 取而代之的是,您可以使用下面的 PowerShell 脚本来实现这一点。

感谢mohit varma您的脚本帮助我找到了解决方案。

$SourceStorageAccount = "source storageaccount"
$SourceStorageKey = "source key"
$DestStorageAccount = "dest storageaccount"
$DestStorageKey = "dest key"

#here added source and destination separately you can use the script for same & differenct container prefix also 
 
$SourceStorageContext = New-AzureStorageContext -StorageAccountName $SourceStorageAccount -StorageAccountKey $SourceStorageKey
$DestStorageContext = New-AzureStorageContext -StorageAccountName $DestStorageAccount -StorageAccountKey $DestStorageKey

$Containers = Get-AzureStorageContainer -Context $SourceStorageContext
$sourceprefixname ="4.1.2.3"
$destPrefixname = "latest"

foreach($Container in $Containers)
{
    $ContainerName = $Container.Name
    if (!((Get-AzureStorageContainer -Context $DestStorageContext) | Where-Object { $_.Name -eq $ContainerName }))
    {   
        Write-Output "Creating new container $ContainerName"
        New-AzureStorageContainer -Name $ContainerName -Permission Off -Context $DestStorageContext -ErrorAction Stop
    }

    $Blobs = Get-AzureStorageBlob -Context $SourceStorageContext -Container $ContainerName
    $BlobCpyAry = @() #Create array of objects
    $folders = New-Object System.Collections.Generic.List[System.Object]

    #Do the copy of everything
    

    foreach ($Blob in $Blobs)
    {
    if($Blob.Name.StartsWith($sourceprefixname))
    {
        $BlobName = $Blob.Name
        $DestBlobNamestr = $BlobName.Replace($sourceprefixname,$destPrefixname)
       Write-Output "Copying $BlobName from $ContainerName"
       $BlobCopy = Start-CopyAzureStorageBlob -Context $SourceStorageContext -SrcContainer $ContainerName -SrcBlob $BlobName -DestContext $DestStorageContext -DestContainer $ContainerName -DestBlob $DestBlobNamestr
       $BlobCpyAry += $BlobCopy
    }
       
    }
    #Check Status
    foreach ($BlobCopy in $BlobCpyAry)
    {
       #Could ignore all rest and just run $BlobCopy | Get-AzureStorageBlobCopyState but I prefer output with % copied
       $CopyState = $BlobCopy | Get-AzureStorageBlobCopyState
       $Message = $CopyState.Source.AbsolutePath + " " + $CopyState.Status + " {0:N2}%" -f (($CopyState.BytesCopied/$CopyState.TotalBytes)*100) 
       Write-Output $Message
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多