Gsutil: gsutil rsyncのときに複数のディレクトリを除外する方法は?

作成日 2019年05月06日  ·  12コメント  ·  ソース: GoogleCloudPlatform/gsutil

ディレクトリ「d」の下にいくつかのサブディレクトリabcがあります
どうすればそれらを一度除外できますか?

question

最も参考になるコメント

ドライランモードで実行するには、rsyncコマンドの-nフラグを使用することも価値があります。 これにより、意図しないファイルをコピーしたかどうかを確認できます。

全てのコメント12件

こんにちは@zffocussss

-xフラグを使用して、正規表現パターンを使用して多くのディレクトリまたはファイルを除外できます。 このドキュメントにはさらにいくつかの情報があります//cloud.google.com/storage/docs/gsutil/commands/rsync

上記のリンク先のドキュメントの例を次に示します。

-x pattern

Causes files/objects matching pattern to be excluded, i.e., any matching files/objects will not be copied or deleted. Note that the pattern is a Python regular expression, not a wildcard (so, matching any string ending in "abc" would be specified using ".*abc$" rather than "*abc"). Note also that the exclude path is always relative (similar to Unix rsync or tar exclude options). For example, if you run the command:

    gsutil rsync -x "data./.*\.txt$" dir gs://my-bucket

it will skip the file dir/data1/a.txt.

You can use regex alternation to specify multiple exclusions, for example:

    gsutil rsync -x ".*\.txt$|.*\.jpg$" dir gs://my-bucket

NOTE: When using this on the Windows command line, use ^ as an escape character instead of \ and escape the | character.

それが役に立ったか、他に質問があれば教えてください!

上記のコメントを更新して、質問に固有の詳細をいくつか追加しました。 :)

上記のコメントを更新して、質問に固有の詳細をいくつか追加しました。 :)

こんにちは@catleeball 、私はそれを試してみます。
gsutil -d -x "a / | b / | c /" -rd gs:// my-bucket
GCPコンソールでバケットを確認しましたが、a、b、cはまだここにあります。
-xは、ディレクトリではなくファイルを除外できると思います。

こんにちは@zffocussss ! 問題は正規表現にあるようです。 これが私が今テストした例です:

このローカルディレクトリ構造を考えるとrsync-test

cball<strong i="9">@cball</strong>:~$ tree rsync-test/
rsync-test/
├── dirA
│   └── bar.txt
├── dirB
│   └── baz.txt
├── dirC
│   ├── baq.txt
│   └── dirCA
│       └── bat.txt
└── foo.txt

dirAdirCAを除くすべてをアップロードするとします。 これを行うには、「パス文字列のサブ文字列 'dirA'またはサブ文字列 'dirCA'を確認してください」という正規表現を記述します。 これを行う1つの方法は次のとおりです。

cball<strong i="15">@cball</strong>:~$ gsutil rsync -r -x '^.*dirA.*$|^.*dirCA.*$' rsync-test gs://rsync-test-cball
Building synchronization state...
Starting synchronization...
Copying file://rsync-test/dirB/baz.txt [Content-Type=text/plain]...
Copying file://rsync-test/dirC/baq.txt [Content-Type=text/plain]...
Copying file://rsync-test/foo.txt [Content-Type=text/plain]...
/ [3 files][    0.0 B/    0.0 B]
Operation completed over 3 objects.

次に、バケットが希望どおりに表示されることを確認してみましょう。

cball<strong i="19">@cball</strong>:~$ gsutil ls gs://rsync-test-cball
gs://rsync-test-cball/foo.txt
gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirC/
cball<strong i="20">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirB/baz.txt
cball<strong i="21">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirC
gs://rsync-test-cball/dirC/baq.txt

正規表現を作成するのに役立つ場合は、 https://regex101.com/が正規表現をテストするための便利なWebサイトであることがわかりました。 正規表現の各部分にマウスを合わせると、その機能がわかります。 🙂

こんにちは@zffocussss ! 問題は正規表現にあるようです。 これが私が今テストした例です:

このローカルディレクトリ構造を考えるとrsync-test

cball<strong i="10">@cball</strong>:~$ tree rsync-test/
rsync-test/
├── dirA
│   └── bar.txt
├── dirB
│   └── baz.txt
├── dirC
│   ├── baq.txt
│   └── dirCA
│       └── bat.txt
└── foo.txt

dirAdirCAを除くすべてをアップロードするとします。 これを行うには、「パス文字列のサブ文字列 'dirA'またはサブ文字列 'dirCA'を確認してください」という正規表現を記述します。 これを行う1つの方法は次のとおりです。

cball<strong i="16">@cball</strong>:~$ gsutil rsync -r -x '^.*dirA.*$|^.*dirCA.*$' rsync-test gs://rsync-test-cball
Building synchronization state...
Starting synchronization...
Copying file://rsync-test/dirB/baz.txt [Content-Type=text/plain]...
Copying file://rsync-test/dirC/baq.txt [Content-Type=text/plain]...
Copying file://rsync-test/foo.txt [Content-Type=text/plain]...
/ [3 files][    0.0 B/    0.0 B]
Operation completed over 3 objects.

次に、バケットが希望どおりに表示されることを確認してみましょう。

cball<strong i="20">@cball</strong>:~$ gsutil ls gs://rsync-test-cball
gs://rsync-test-cball/foo.txt
gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirC/
cball<strong i="21">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirB/baz.txt
cball<strong i="22">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirC
gs://rsync-test-cball/dirC/baq.txt

正規表現を作成するのに役立つ場合は、 https://regex101.com/が正規表現をテストするための便利なWebサイトであることがわかりました。 正規表現の各部分にマウスを合わせると、その機能がわかります。 🙂

ああ、なんてことだ。助けてくれてありがとう。それがpython正規表現だと知っている。pcreとshell正規表現を使った。
あなたは正しいです。gsutilで正規表現を確認する必要があります。

こんにちは@zffocussss ! 問題は正規表現にあるようです。 これが私が今テストした例です:

このローカルディレクトリ構造を考えるとrsync-test

cball<strong i="10">@cball</strong>:~$ tree rsync-test/
rsync-test/
├── dirA
│   └── bar.txt
├── dirB
│   └── baz.txt
├── dirC
│   ├── baq.txt
│   └── dirCA
│       └── bat.txt
└── foo.txt

dirAdirCAを除くすべてをアップロードするとします。 これを行うには、「パス文字列のサブ文字列 'dirA'またはサブ文字列 'dirCA'を確認してください」という正規表現を記述します。 これを行う1つの方法は次のとおりです。

cball<strong i="16">@cball</strong>:~$ gsutil rsync -r -x '^.*dirA.*$|^.*dirCA.*$' rsync-test gs://rsync-test-cball
Building synchronization state...
Starting synchronization...
Copying file://rsync-test/dirB/baz.txt [Content-Type=text/plain]...
Copying file://rsync-test/dirC/baq.txt [Content-Type=text/plain]...
Copying file://rsync-test/foo.txt [Content-Type=text/plain]...
/ [3 files][    0.0 B/    0.0 B]
Operation completed over 3 objects.

次に、バケットが希望どおりに表示されることを確認してみましょう。

cball<strong i="20">@cball</strong>:~$ gsutil ls gs://rsync-test-cball
gs://rsync-test-cball/foo.txt
gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirC/
cball<strong i="21">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirB/baz.txt
cball<strong i="22">@cball</strong>:~$ gsutil ls gs://rsync-test-cball/dirC
gs://rsync-test-cball/dirC/baq.txt

正規表現を作成するのに役立つ場合は、 https://regex101.com/が正規表現をテストするための便利なWebサイトであることがわかりました。 正規表現の各部分にマウスを合わせると、その機能がわかります。 🙂

ちなみに、これらはlinuxのパスにあるため、この正規表現形式をどのようにテストしますか。文字列ではありません。

ちなみに、これらはlinuxのパスにあるため、この正規表現形式をどのようにテストしますか。文字列ではありません。

こんにちは@zffocussssgsutil rsyncが実行されると、ソースディレクトリのディレクトリツリーをたどります。 除外パターンを含めると、各ファイル/ディレクトリが指定された正規表現と照合されます。

https://github.com/GoogleCloudPlatform/gsutil/blob/master/gslib/commands/rsync.py#L745

Python REPLを開くと、次のようなもので正規表現をテストできます。

cball<strong i="13">@cball</strong>:~$ python
Python 3.7.3 (default, Apr 25 2019, 13:07:15) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r = re.compile('^.*dirA.*$|^.*dirCA.*$')
>>> dirs = ['rsync-test/dirA', 'rsync-test/dirB', 'rsync-test/dirC', 'rsync-test/dirC/dirCA']
>>> for d in dirs:
...   if r.match(d):
...     print('Regex matches: ' + d)
...   else:
...     print('Regex does not match: ' + d)
... 
Regex matches: rsync-test/dirA
Regex does not match: rsync-test/dirB
Regex does not match: rsync-test/dirC
Regex matches: rsync-test/dirC/dirCA

または、オンライン正規表現テスターを使用している場合は、さまざまなディレクトリをプラグインして、一致するディレクトリと一致しないディレクトリを確認できます。 :slightly_smiling_face:

お役に立てば幸いです。 他にご不明な点がございましたら、@ zffocussssまでお知らせください

ドライランモードで実行するには、rsyncコマンドの-nフラグを使用することも価値があります。 これにより、意図しないファイルをコピーしたかどうかを確認できます。

スマートシンキング、 @ houglum ! :バルブ:

ちなみに、これらはlinuxのパスにあるため、この正規表現形式をどのようにテストしますか。文字列ではありません。

こんにちは@zffocussssgsutil rsyncが実行されると、ソースディレクトリのディレクトリツリーをたどります。 除外パターンを含めると、各ファイル/ディレクトリが指定された正規表現と照合されます。

https://github.com/GoogleCloudPlatform/gsutil/blob/master/gslib/commands/rsync.py#L745

Python REPLを開くと、次のようなもので正規表現をテストできます。

cball<strong i="14">@cball</strong>:~$ python
Python 3.7.3 (default, Apr 25 2019, 13:07:15) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r = re.compile('^.*dirA.*$|^.*dirCA.*$')
>>> dirs = ['rsync-test/dirA', 'rsync-test/dirB', 'rsync-test/dirC', 'rsync-test/dirC/dirCA']
>>> for d in dirs:
...   if r.match(d):
...     print('Regex matches: ' + d)
...   else:
...     print('Regex does not match: ' + d)
... 
Regex matches: rsync-test/dirA
Regex does not match: rsync-test/dirB
Regex does not match: rsync-test/dirC
Regex matches: rsync-test/dirC/dirCA

または、オンライン正規表現テスターを使用している場合は、さまざまなディレクトリをプラグインして、一致するディレクトリと一致しないディレクトリを確認できます。 🙂

お役に立てば幸いです。 他にご不明な点がございましたら、@ zffocussssまでお知らせください

わかりました。なるほど。ありがとう。

ドライランモードで実行するには、rsyncコマンドの-nフラグを使用することも価値があります。 これにより、意図しないファイルをコピーしたかどうかを確認できます。

とても素敵なアドバイスです。これを使って何が起こるかを見ることができます

ちなみに、これらはlinuxのパスにあるため、この正規表現形式をどのようにテストしますか。文字列ではありません。

こんにちは@zffocussssgsutil rsyncが実行されると、ソースディレクトリのディレクトリツリーをたどります。 除外パターンを含めると、各ファイル/ディレクトリが指定された正規表現と照合されます。

https://github.com/GoogleCloudPlatform/gsutil/blob/master/gslib/commands/rsync.py#L745

Python REPLを開くと、次のようなもので正規表現をテストできます。

cball<strong i="14">@cball</strong>:~$ python
Python 3.7.3 (default, Apr 25 2019, 13:07:15) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r = re.compile('^.*dirA.*$|^.*dirCA.*$')
>>> dirs = ['rsync-test/dirA', 'rsync-test/dirB', 'rsync-test/dirC', 'rsync-test/dirC/dirCA']
>>> for d in dirs:
...   if r.match(d):
...     print('Regex matches: ' + d)
...   else:
...     print('Regex does not match: ' + d)
... 
Regex matches: rsync-test/dirA
Regex does not match: rsync-test/dirB
Regex does not match: rsync-test/dirC
Regex matches: rsync-test/dirC/dirCA

または、オンライン正規表現テスターを使用している場合は、さまざまなディレクトリをプラグインして、一致するディレクトリと一致しないディレクトリを確認できます。 🙂

お役に立てば幸いです。 他にご不明な点がございましたら、@ zffocussssまでお知らせください

r = re.compile( '^。 / dirA/。$ | ^。* / dirA $ | ^ dirA')
dirs = ['rsync-test / dirA'、 'rsync-test / dirB'、 'rsync-test / dirC'、 'rsync-test / dirC / dirCA'、 'a / dirAk / b'、 'a / dirA / b '、' dirA / A / B / C ']
[18]の場合:dirsのdの場合:
...:r.match(d)の場合:
...:print( '正規表現の一致:' + d)
...: そうしないと:
...:print( '正規表現が一致しません:' + d)
...:

正規表現の一致:rsync-test / dirA
正規表現が一致しません:rsync-test / dirB
正規表現が一致しません:rsync-test / dirC
正規表現が一致しません:rsync-test / dirC / dirCA
正規表現が一致しません:a / dirAk / b
正規表現の一致:a / dirA / b
正規表現の一致:dirA / A / B / C

欲しいものが見つかるかもしれません。サブディレクトリなので、「/」を検討する必要があります。
また、GCP gsutilチームは、正規表現を操作するときに、少し複雑ですが実際に使用されているため、より多くの例を提供できることをお勧めします。

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