2020年4月30日木曜日

azcopyのcopyコマンドでサブディレクトリ内にあるシンボリックリンクをアップロードする

azcopyツールでシンボリックリンクをアップロードの対象にするには、copyコマンドを使えば良いということは、azcopyのヘルプを見ればわかることだ。
しかしWindows系の場合、サブディレクトリ内にあるとアップロードできないバグがあることは周知されていない(ような気がする)。
2019年12月13日にバグ報告をしたのだが、一向に修正されないので、解決策を日本語で書いておこうと思う。

現在の作業ディレクトリを「Z:\」とし、以下のディレクトリをアップロードの対象とする場合、

Z:\directory
└─sub-directory
    ├─textfile1.txt (シンボリックリンク)
    └─textfile2.txt

仕様通りにアップロードしようとするなら、以下のコマンドを実行すればアップロードできるはず。

azcopy.exe copy "Z:\directory\" "https://host/blob/?$key" --follow-symlinks --recursive --from-to=LocalBlob

しかし、実際には以下のエラーが出てアップロードできない。

failed to perform copy command due to error: no transfers were scheduled because no files matched the specified criteria

そこで、ワイルドカードを使って明示的にファイルを指定してやる。

azcopy.exe copy "Z:\directory\*" "https://host/blob/?$key" --follow-symlinks --from-to=LocalBlob

ただし、「--recursive」機能が使えなくなるので、「sub-directory」内のディレクトリを対象にできなくなってしまう点には注意。
再帰的にシンボリックリンクを対象にしたい場合は、Get-ChildItemコマンドを併用する必要があるだろう。