gsutil rm -I
を使用して、削除するURLのリストをstdinに渡そうとしています。
たとえば、 gs://test-bucket/test-dir
にある既存のディレクトリの場合、次のコマンドを試しました。
# verify directory exists
$ gsutil ls -d gs://test-bucket/test-dir
gs://test-bucket/test-dir/
$ echo "gs://test-bucket/test-dir" | gsutil -m rm -r -I
CommandException: No URLs matched
$ echo gs://test-bucket/test-dir | gsutil -m rm -r -I
CommandException: No URLs matched
$ gsutil -m rm -r -I <<< "gs://test-bucket/test-dir"
CommandException: No URLs matched
$ gsutil ls -d gs://test-bucket/test-dir | gsutil -m rm -r -I
CommandException: No URLs matched
ここで何かが足りませんか?
いいえ、あなたが何かを見逃しているとは思いません-私もこれを再現することができます。 上記のgsutilrmコマンドを-DDフラグを指定して実行すると、gsutilが問題のオブジェクトをチェックするためのAPI呼び出しを行っていないことがわかります。
name_expansion.pyを見ると、PluralityCheckableIteratorを作成しています。これは、NameExpansionIteratorをラップし、stdin(_phew_)から行を読み取ることになっているジェネレーターをラップする別のPluralityCheckableIteratorオブジェクトをラップします。 とにかく、plural_checkable_iterator.pyの_PopulateHead()メソッドにいくつかのデバッグ印刷ステートメントをスローしましたが、基になるジェネレーターがStopIteration例外をスローしていることがわかりました。 理由はまだよくわかりません-私はすぐに調査を続けます。
自己へのメモ:
今日もこの問題に遭遇しました(gsutilバージョン4.28)。 既知の回避策はありますか?
頭から離れて、私は1つしか考えられません:自分でgsutilに引数を渡すための薄いラッパースクリプトを記述して( xargs
ようなものを使用して)、_のバッチに対してgsutil呼び出しを実行するようにしてください
私も同じことを見ています...
CommandException: No URLs matched
tarファイルをバケットにコピーしているときに同じ例外が発生します。 CommandException: No URLs matched
同じ問題を見ています。 提案された解決策はありますか?
解決策があるかどうかわからない:
私は走っています-
gsutil version: 4.34
そしてこれを手に入れよう
CommandException: Destination URL must name a directory, bucket, or bucket
subdirectory for the multiple source form of the cp command.
実行しようとしたとき:
gsutil cp -n -R gs://hail-common/vep/vep/GRCh37/loftee_data /vep/loftee_data_grch37
これを他の場所に投稿する必要があるかどうか教えてください。
ありがとう
私は同じ問題を抱えていました、私はファイルの名前を変更しました、そしてそれは働きました:)。
これに関するニュースはありますか?
gsutilv4.59でも同じ問題が発生します。 バケットを削除しようとすると、コンソールでバケットを確認したときにバケットが明らかに存在していても、同じエラーが発生します。
返信が遅れてすみません。 私たちのチームは現在、他の優先事項に取り組んでおり、現時点ではこの問題に対処するための帯域幅がありません。 しかし、私は将来の参考のためにいくつかの調査を行いました。
これは、url_strsが2回繰り返されるために発生しているようです。再帰が要求された場合はhttps://github.com/GoogleCloudPlatform/gsutil/blob/d8626ae0ec4b4dc9fd729f115cdeefced4680cb5/gslib/commands/rm.py#L269に渡され、次に渡されます。 NameExpansionIterator https://github.com/GoogleCloudPlatform/gsutil/blob/d8626ae0ec4b4dc9fd729f115cdeefced4680cb5/gslib/commands/rm.py#L288
つまり、基本的に、イテレータを2回反復しようとしているため、2番目のインスタンスでは空のイテレータを取得します。
簡単な修正は、イテレータをリストに変換することです。つまり、 ます。
url_strs = [url for url in StdinIterator()]
ただし、これは、stdinからのリストが非常に長いユーザー、またはパイプラインでこの機能をすでに使用していて、-rと-Iを実際には使用していないユーザーに影響を与える可能性があります。 これは、-rと-Iを一緒に使用している場合にのみ影響することに注意してください。
理想的な修正は、再帰の特殊なケースを削除し、代わりにNameExpansionIteratorの結果自体に基づいてバケットの削除を処理することです。
回避策は、 https: //github.com/GoogleCloudPlatform/gsutil/issues/490#issuecomment-364611242で提案されているものです
または、再帰(-rオプション)の使用を避けてリストに渡すこともできます
gsutil ls gs://my_bucket/** | gsutil -m rm -I
上記のコマンドはバケットを空にしますが、バケットを削除しないことに注意してください。バケットを削除するには、別のコマンドを実行する必要があります。
最も参考になるコメント
同じ問題を見ています。 提案された解決策はありますか?