コマンドラインからGoogle Cloud Storage (GCS) を操作することができる gsutil
パッケージ。
複数のファイルをGCPにコピーする場合は gsutil cp
コマンドを並列に処理する為に gsutil -m cp
といった感じで使う。
しかしあるとき以下のようなエラーが発生した。
Argument list too long
この Argument list too long
エラーは何故発生したのか。
回避する方法はあるのか。
今回はそんな問題を解決するために、「gsutilで"argument list too long"エラーが出る原因」を解説する。
この記事を書いている人
記事を読むメリット
gsutilで"argument list too long"エラーが出る原因
実は Argument list too long
エラーはgsutilのエラーではない。
このエラーはもっと手前の bash
や zsh
で発生するエラーである。
意味はエラーメッセージをそのまま翻訳した通り「引数が長すぎる」こと。
このエラーが発生する例として以下のようなコマンドを実行しているはずだ。
gsutil -m cp ./* gs://mybucket/mydir
問題は *
ワイルドカードの部分。
ワイルドカードを指定した際に、シェル側で条件に合致するファイルをひたすらコマンドの引数として渡す。
が、この「条件に合致するファイル」の数が多すぎる場合に Argument list too long
となってしまう。
gsutilで"argument list too long"エラーの回避方法
原因はワイルドカードで指定した引数が多すぎるからとして、どうやってエラーを回避すればいいのか。
エラーの回避方法は実は単純で、ワイルドカードで指定している引数をダブルクオートで囲むことで回避できる。
gsutil -m cp "./*" gs://mybucket/mydir
こうすることでワイルドカードの処理がシェルではなくgsutilの方で行われるようになる。
gsutilの方がワイルドカードの処理の仕方がスマートなので Argument list too long
エラーは起こらなくなる。
gsutil -m cp ./* gs://mybucket/mydir
./*
↓
./
にある全ファイルを抽出して gsutil コマンドに引数として渡す
gsutil -m cp "./*" gs://mybucket/mydir
"./*"
↓
"./*" のまま gsutil コマンドに引数として渡す
↓
gsutilの中で"./*"の判定を行う
The "Argument list too long" error is coming from the shell, which has a limited size buffer for expanded wildcards. By quoting the wildcard you prevent the shell from expanding the wildcard and instead the shell passes that literal string to gsutil. gsutil then expands the wildcard in a streaming fashion, i.e., expanding it while performing the operations, so it never needs to buffer an unbounded amount of expanded text.
(訳)
「引数リストが長すぎます」エラーは、拡張ワイルドカード用の制限されたサイズのバッファがあるシェルから発生しています。ワイルドカードを引用することにより、シェルがワイルドカードを展開するのを防ぎ、代わりにシェルはそのリテラル文字列をgsutilに渡します。次に、gsutilはワイルドカードをストリーミング方式で展開します。つまり、操作の実行中にワイルドカードを展開するため、無制限の量の展開されたテキストをバッファリングする必要はありません。
gsutilで"argument list too long"エラーが出る原因 まとめ
gsutilで"argument list too long"エラーが出る原因は、シェルにワイルドカードで引き渡す引数が多すぎるから。
解決方法としてはワイルドカードを含む引数を""で括る。
こうすることでワイルドカードをシェルではなくgsutilが処理をするのでエラーが起こらなくなる。
他にもgsutilで並列コピーする際に TypeError
が起こる場合の原因と対処方法についての記事もあるので、気になった方は見て欲しい。