Gsutil: comment exclure plusieurs répertoires lorsque gsutil rsync?

Créé le 6 mai 2019  ·  12Commentaires  ·  Source: GoogleCloudPlatform/gsutil

J'ai des sous-répertoires abc sous le répertoire "d"
comment puis-je les exclure une fois ?

question

Commentaire le plus utile

Il vaut également la peine d'utiliser le drapeau -n de la commande rsync pour s'exécuter en mode de simulation. Cela vous permettra de voir si vous auriez copié des fichiers que vous n'aviez pas l'intention de faire.

Tous les 12 commentaires

Salut @zffocussss !

Vous pouvez utiliser l'indicateur -x pour exclure de nombreux répertoires ou fichiers à l'aide d'un modèle regex. Il y a plus d'informations dans ce document : https://cloud.google.com/storage/docs/gsutil/commands/rsync

Voici d'autres exemples tirés du document lié ci-dessus :

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

N'hésitez pas à me dire si cela vous aide ou si vous avez d'autres questions !

Mise à jour du commentaire ci-dessus avec quelques détails supplémentaires spécifiques à votre question. :)

Mise à jour du commentaire ci-dessus avec quelques détails supplémentaires spécifiques à votre question. :)

Salut @catleeball , je l'essaye.
gsutil -d -x "a/|b/|c/" -rd gs://my-bucket
mais cela ne fonctionne pas.Je vérifie mon bucket dans la console GCP, mais a,b,c est toujours là.
Je pense que -x peut simplement exclure des fichiers et non des répertoires.

Salut @zffocussss ! Il semble que le problème soit lié à votre regex. Voici un exemple que je viens de tester :

Étant donné cette structure de répertoire 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

Disons que nous voulons tout télécharger sauf dirA et dirCA . Nous pouvons le faire en écrivant une expression régulière pour dire "vérifier la chaîne de chemin pour la sous-chaîne 'dirA' ou la sous-chaîne 'dirCA'". Voici une façon de procéder :

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.

Maintenant, vérifions et assurons-nous que le bucket ressemble à ce que nous voulons :

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

Si cela vous aide à écrire votre regex, j'ai trouvé que https://regex101.com/ est un site Web pratique pour tester les regex. Vous pouvez passer la souris sur chaque partie de l'expression régulière et elle vous indique ce qu'elle fait. ??

Salut @zffocussss ! Il semble que le problème soit lié à votre regex. Voici un exemple que je viens de tester :

Étant donné cette structure de répertoire 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

Disons que nous voulons tout télécharger sauf dirA et dirCA . Nous pouvons le faire en écrivant une expression régulière pour dire "vérifier la chaîne de chemin pour la sous-chaîne 'dirA' ou la sous-chaîne 'dirCA'". Voici une façon de procéder :

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.

Maintenant, vérifions et assurons-nous que le bucket ressemble à ce que nous voulons :

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

Si cela vous aide à écrire votre regex, j'ai trouvé que https://regex101.com/ est un site Web pratique pour tester les regex. Vous pouvez passer la souris sur chaque partie de l'expression régulière et elle vous indique ce qu'elle fait. ??

oh mon dieu. merci pour votre aide. Je sais que c'est python regex. J'ai utilisé les regex pcre et shell.
vous avez raison.Je dois vérifier mon regex dans gsutil.

Salut @zffocussss ! Il semble que le problème soit lié à votre regex. Voici un exemple que je viens de tester :

Étant donné cette structure de répertoire 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

Disons que nous voulons tout télécharger sauf dirA et dirCA . Nous pouvons le faire en écrivant une expression régulière pour dire "vérifier la chaîne de chemin pour la sous-chaîne 'dirA' ou la sous-chaîne 'dirCA'". Voici une façon de procéder :

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.

Maintenant, vérifions et assurons-nous que le bucket ressemble à ce que nous voulons :

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

Si cela vous aide à écrire votre regex, j'ai trouvé que https://regex101.com/ est un site Web pratique pour tester les regex. Vous pouvez passer la souris sur chaque partie de l'expression régulière et elle vous indique ce qu'elle fait. ??

Au fait, comment testez-vous ce format regex car ils se trouvent dans le chemin de linux. Ils ne sont pas des chaînes.

Au fait, comment testez-vous ce format regex car ils se trouvent dans le chemin de linux. Ils ne sont pas des chaînes.

Salut @zffocussss ! Lorsque gsutil rsync s'exécute, il parcourt l'arborescence du répertoire source. Si vous incluez un modèle d'exclusion, chaque fichier/répertoire est comparé à votre regex fournie :

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

Si vous ouvrez Python REPL, vous pouvez tester votre regex avec quelque chose comme ceci :

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 si vous utilisez le testeur de regex en ligne, vous pouvez brancher différents répertoires et voir ceux qui correspondent ou non. :slightly_smileing_face:

J'espère que ça aide ! N'hésitez pas à me contacter si vous avez d'autres questions @zffocussss !

Il vaut également la peine d'utiliser le drapeau -n de la commande rsync pour s'exécuter en mode de simulation. Cela vous permettra de voir si vous auriez copié des fichiers que vous n'aviez pas l'intention de faire.

Pensée intelligente,

Au fait, comment testez-vous ce format regex car ils se trouvent dans le chemin de linux. Ils ne sont pas des chaînes.

Salut @zffocussss ! Lorsque gsutil rsync s'exécute, il parcourt l'arborescence du répertoire source. Si vous incluez un modèle d'exclusion, chaque fichier/répertoire est comparé à votre regex fournie :

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

Si vous ouvrez Python REPL, vous pouvez tester votre regex avec quelque chose comme ceci :

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 si vous utilisez le testeur de regex en ligne, vous pouvez brancher différents répertoires et voir ceux qui correspondent ou non. ??

J'espère que ça aide ! N'hésitez pas à me contacter si vous avez d'autres questions @zffocussss !

ok.je vois.merci.

Il vaut également la peine d'utiliser le drapeau -n de la commande rsync pour s'exécuter en mode de simulation. Cela vous permettra de voir si vous auriez copié des fichiers que vous n'aviez pas l'intention de faire.

si bon conseil.Je peux l'utiliser pour voir ce qui va se passer

Au fait, comment testez-vous ce format regex car ils se trouvent dans le chemin de linux. Ils ne sont pas des chaînes.

Salut @zffocussss ! Lorsque gsutil rsync s'exécute, il parcourt l'arborescence du répertoire source. Si vous incluez un modèle d'exclusion, chaque fichier/répertoire est comparé à votre regex fournie :

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

Si vous ouvrez Python REPL, vous pouvez tester votre regex avec quelque chose comme ceci :

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 si vous utilisez le testeur de regex en ligne, vous pouvez brancher différents répertoires et voir ceux qui correspondent ou non. ??

J'espère que ça aide ! N'hésitez pas à me contacter si vous avez d'autres questions @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']
Dans [18] : pour d dans dirs :
...: si r.match(d):
...: print('Regex correspond à: ' + d)
...: autre:
...: print('Regex ne correspond pas : ' + d)
... :

Correspondances Regex : rsync-test/dirA
Regex ne correspond pas : rsync-test/dirB
Regex ne correspond pas : rsync-test/dirC
Regex ne correspond pas : rsync-test/dirC/dirCA
L'expression régulière ne correspond pas : a/dirAk/b
Correspondances d'expression régulière : a/dirA/b
Correspondances Regex : dirA/A/B/C

Je peux trouver ce que je veux. Je dois considérer "/", car il s'agit d'un sous-répertoire.
Je suggère également que l'équipe GCP gsutil puisse fournir plus d'exemples lors de l'utilisation de regex, car c'est un peu complexe mais il est utilisé en réalité.

Cette page vous a été utile?
0 / 5 - 0 notes