Gsutil: CommandException:stdinからrmにURLを渡すときに一致するURLがありません

作成日 2017年12月21日  ·  11コメント  ·  ソース: GoogleCloudPlatform/gsutil

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

ここで何かが足りませんか?

最も参考になるコメント

同じ問題を見ています。 提案された解決策はありますか?

全てのコメント11件

いいえ、あなたが何かを見逃しているとは思いません-私もこれを再現することができます。 上記のgsutilrmコマンドを-DDフラグを指定して実行すると、gsutilが問題のオブジェクトをチェックするためのAPI呼び出しを行っていないことがわかります。

name_expansion.pyを見ると、PluralityCheckableIteratorを作成しています。これは、NameExpansionIteratorをラップし、stdin(_phew_)から行を読み取ることになっているジェネレーターをラップする別のPluralityCheckableIteratorオブジェクトをラップします。 とにかく、plural_checkable_iterator.pyの_PopulateHead()メソッドにいくつかのデバッグ印刷ステートメントをスローしましたが、基になるジェネレーターがStopIteration例外をスローしていることがわかりました。 理由はまだよくわかりません-私はすぐに調査を続けます。

自己へのメモ:

  • 戻って最近のコミットをバイナリ検索し、これがどの時点で発生し始めたかを確認します。
  • なぜテストはこれをキャッチしなかったのですか?
  • これと同じアプローチはcpコマンドでは機能しますが、rmでは機能しません。

今日もこの問題に遭遇しました(gsutilバージョン4.28)。 既知の回避策はありますか?

頭から離れて、私は1つしか考えられません:自分でgsutilに引数を渡すための薄いラッパースクリプトを記述して( xargsようなものを使用して)、_のバッチに対してgsutil呼び出しを実行するようにしてください$ ARG_MAX値> _オブジェクト。

私も同じことを見ています...
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

上記のコマンドはバケットを空にしますが、バケットを削除しないことに注意してください。バケットを削除するには、別のコマンドを実行する必要があります。

このページは役に立ちましたか?
0 / 5 - 0 評価