Gsutil: como excluir vários diretórios quando gsutil rsync?

Criado em 6 mai. 2019  ·  12Comentários  ·  Fonte: GoogleCloudPlatform/gsutil

Tenho alguns subdiretórios abc no diretório "d"
como posso excluí-los uma vez?

question

Comentários muito úteis

Também vale a pena usar o sinalizador -n do comando rsync para executar no modo de simulação. Isso permitirá que você veja se teria copiado os arquivos que não pretendia.

Todos 12 comentários

Oi @zffocussss !

Você pode usar o sinalizador -x para excluir muitos diretórios ou arquivos usando um padrão regex. Há mais algumas informações neste documento: https://cloud.google.com/storage/docs/gsutil/commands/rsync

Aqui estão mais exemplos do documento com link acima:

-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.

Entre em contato se isso ajudar ou se você tiver alguma outra dúvida.

Atualizado o comentário acima com mais alguns detalhes específicos para sua pergunta. :)

Atualizado o comentário acima com mais alguns detalhes específicos para sua pergunta. :)

Olá, @catleeball , estou tentando.
gsutil -d -x "a / | b / | c /" -rd gs: // my-bucket
mas não funciona. Verifico meu intervalo no console do GCP, mas a, b, c ainda está aqui.
Acho que -x apenas pode excluir arquivos, não diretórios.

Oi @zffocussss ! Parece que o problema pode ser com sua regex. Aqui está um exemplo que acabei de testar:

Dada esta estrutura de diretório local 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

Digamos que queremos fazer upload de tudo, exceto dirA e dirCA . Podemos fazer isso escrevendo um regex para dizer "verifique a string de caminho para substring 'dirA' ou substring 'dirCA'". Esta é uma maneira de fazer isso:

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.

Agora vamos verificar e ter certeza de que o balde está com a aparência que queremos:

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

Se for útil para você escrever sua regex, descobri que https://regex101.com/ é um site útil para testar regexes. Você pode passar o mouse sobre cada parte da regex e ela informará o que faz. 🙂

Oi @zffocussss ! Parece que o problema pode ser com sua regex. Aqui está um exemplo que acabei de testar:

Dada esta estrutura de diretório local 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

Digamos que queremos fazer upload de tudo, exceto dirA e dirCA . Podemos fazer isso escrevendo um regex para dizer "verifique a string de caminho para substring 'dirA' ou substring 'dirCA'". Esta é uma maneira de fazer isso:

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.

Agora vamos verificar e ter certeza de que o balde está com a aparência que queremos:

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

Se for útil para você escrever sua regex, descobri que https://regex101.com/ é um site útil para testar regexes. Você pode passar o mouse sobre cada parte da regex e ela informará o que faz. 🙂

oh meu deus. obrigado por sua ajuda. eu sei que é python regex. eu usei o pcre e shell regex.
você está certo. Preciso verificar meu regex no gsutil.

Oi @zffocussss ! Parece que o problema pode ser com sua regex. Aqui está um exemplo que acabei de testar:

Dada esta estrutura de diretório local 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

Digamos que queremos fazer upload de tudo, exceto dirA e dirCA . Podemos fazer isso escrevendo um regex para dizer "verifique a string de caminho para substring 'dirA' ou substring 'dirCA'". Esta é uma maneira de fazer isso:

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.

Agora vamos verificar e ter certeza de que o balde está com a aparência que queremos:

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

Se for útil para você escrever sua regex, descobri que https://regex101.com/ é um site útil para testar regexes. Você pode passar o mouse sobre cada parte da regex e ela informará o que faz. 🙂

A propósito, como você testa este formato de regex visto que eles estão no caminho do linux. Eles não são string.

A propósito, como você testa este formato de regex visto que eles estão no caminho do linux. Eles não são string.

Oi @zffocussss ! Quando gsutil rsync é executado, ele percorre a árvore de diretórios do diretório de origem. Se você incluir um padrão de exclusão, cada arquivo / diretório será comparado ao seu regex fornecido:

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

Se você abrir o REPL do Python, poderá testar seu regex com algo assim:

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

Ou, se estiver usando o testador de regex online, você pode conectar diferentes diretórios e ver quais correspondem ou não. : ligeiramente_smiling_face:

Espero que ajude! Entre em contato se tiver outras dúvidas

Também vale a pena usar o sinalizador -n do comando rsync para executar no modo de simulação. Isso permitirá que você veja se teria copiado os arquivos que não pretendia.

Pensamento inteligente, @houglum ! :lâmpada:

A propósito, como você testa este formato de regex visto que eles estão no caminho do linux. Eles não são string.

Oi @zffocussss ! Quando gsutil rsync é executado, ele percorre a árvore de diretórios do diretório de origem. Se você incluir um padrão de exclusão, cada arquivo / diretório será comparado ao seu regex fornecido:

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

Se você abrir o REPL do Python, poderá testar seu regex com algo assim:

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

Ou, se estiver usando o testador de regex online, você pode conectar diferentes diretórios e ver quais correspondem ou não. 🙂

Espero que ajude! Entre em contato se tiver outras dúvidas

ok.Eu vejo. obrigado.

Também vale a pena usar o sinalizador -n do comando rsync para executar no modo de simulação. Isso permitirá que você veja se teria copiado os arquivos que não pretendia.

conselho tão bom. Posso usar isso para ver o que vai acontecer

A propósito, como você testa este formato de regex visto que eles estão no caminho do linux. Eles não são string.

Oi @zffocussss ! Quando gsutil rsync é executado, ele percorre a árvore de diretórios do diretório de origem. Se você incluir um padrão de exclusão, cada arquivo / diretório será comparado ao seu regex fornecido:

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

Se você abrir o REPL do Python, poderá testar seu regex com algo assim:

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

Ou, se estiver usando o testador de regex online, você pode conectar diferentes diretórios e ver quais correspondem ou não. 🙂

Espero que ajude! Entre em contato se tiver outras dúvidas

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 ']
Em [18]: para d em dirs:
...: se r.match (d):
...: print ('Correspondências de Regex:' + d)
...: outro:
...: print ('Regex não corresponde a:' + d)
...:

Correspondências de regex: rsync-test / dirA
Regex não corresponde: rsync-test / dirB
Regex não corresponde: rsync-test / dirC
Regex não corresponde: rsync-test / dirC / dirCA
Regex não corresponde: a / dirAk / b
Correspondências de regex: a / dirA / b
Correspondências de regex: dirA / A / B / C

Posso encontrar o que desejo. Preciso considerar "/", pois é um subdiretório.
Também sugiro que a equipe gsutil do GCP possa fornecer mais exemplos ao operar regex, pois é um pouco complexo, mas é usado na verdade.

Esta página foi útil?
0 / 5 - 0 avaliações