A Google Cloud CLI suporta a utilização de carateres universais URI para ficheiros, contentores e objetos. Os carateres universais permitem-lhe trabalhar de forma eficiente com grupos de ficheiros que correspondem a padrões de nomenclatura especificados. Esta página descreve os carateres universais suportados e indica considerações importantes quando usa carateres universais em comandos.
Carateres universais
A CLI gcloud suporta os seguintes carateres universais:
Personagem | Descrição |
---|---|
* |
Corresponde a zero ou mais carateres no nível do diretório atual. Por exemplo, cp gs://my-bucket/abc/d* corresponde ao objeto abc/def.txt , mas não ao objeto abc/def/g.txt . No caso de comandos de apresentação, como ls , se um * final corresponder a um subdiretório no nível do diretório atual, o conteúdo do subdiretório também é apresentado. |
** |
Corresponde a zero ou mais carateres nos limites dos diretórios. Quando usado como parte de um caminho de ficheiro local, o caráter universal ** deve ser sempre imediatamente precedido por um delimitador de diretório. Por exemplo, my-directory/**.txt é válido, mas my-directory/abc** não é. |
? |
Corresponde a um único caráter. Por exemplo, gs://bucket/??.txt só corresponde a objetos com exatamente dois carateres seguidos de .txt . |
[CHARACTERS] |
Corresponde a qualquer um dos carateres especificados. Por exemplo, gs://bucket/[aeiou].txt corresponde a objetos que contêm um único caráter de vogal seguido de .txt . |
[CHARACTER_RANGE] |
Corresponde a qualquer um dos intervalos de carateres. Por exemplo, gs://bucket/[a-e].txt corresponde a objetos que contêm a letra a, b, c, d ou e seguida de .txt . |
Pode combinar carateres universais para fornecer correspondências mais eficazes, por exemplo:
gs://*/[a-m]??.j*g
Tenha em atenção que, a menos que o seu comando inclua uma flag para devolver versões de objetos não atuais nos resultados, estes carateres universais só correspondem a versões de objetos ativas.
A CLI gcloud suporta os mesmos carateres universais para nomes de objetos e ficheiros. Assim, por exemplo:
gcloud storage cp data/abc* gs://bucket
corresponde a todos os ficheiros que começam por abc
no diretório data
do sistema de ficheiros local.
Considerações sobre o comportamento
Existem vários casos em que a utilização de carateres universais pode resultar num comportamento surpreendente:
Quando usa carateres universais em nomes de contentores, as correspondências estão limitadas a contentores num único projeto. Muitos comandos permitem-lhe especificar um projeto através de uma flag. Se um comando não incluir uma marca de projeto ou não suportar a utilização de uma marca de projeto, as correspondências estão limitadas a contentores no projeto predefinido.
As shells (como bash e zsh) podem tentar expandir os carateres universais antes de passar os argumentos para a CLI gcloud. Se o caráter universal se destinar a referir-se a um objeto na nuvem, isto pode resultar em erros "Não encontrado" surpreendentes. Por exemplo, a shell pode tentar expandir o caráter universal
gs://my-bucket/*
na máquina local, o que não corresponderia a nenhum ficheiro local, fazendo com que o comando falhasse.Além disso, algumas shells incluem outros carateres nos respetivos conjuntos de carateres universais. Por exemplo, se usar o zsh com a opção extendedglob ativada, trata
#
como um caráter especial, o que entra em conflito com a utilização desse caráter na referência a objetos com versões (consulte Restaurar versões de objetos não atuais para ver um exemplo).Para evitar estes problemas, coloque a expressão com carateres universais entre aspas simples (no Linux) ou aspas duplas (no Windows).
A tentativa de especificar um nome de ficheiro que contenha carateres universais não funciona, porque as ferramentas de linha de comandos tentam expandir os carateres universais em vez de os usar como carateres literais. Por exemplo, executar o comando:
gcloud storage cp './file[1]' gs://my-bucket
Nunca copia um ficheiro local com o nome
file[1]
. Em alternativa, a CLI gcloud trata sempre o[1]
como um caráter universal.A CLI gcloud não suporta um modo "raw" que lhe permita trabalhar com nomes de ficheiros que contenham carateres universais. Para esses ficheiros, deve usar uma ferramenta diferente, como a Google Cloud consola, ou usar um caráter universal para capturar os ficheiros. Por exemplo, para capturar um ficheiro denominado
file[1]
, pode usar o seguinte comando:gcloud storage cp './file*1*' gs://my-bucket
De acordo com o comportamento padrão do Unix, o caráter universal
*
só corresponde a ficheiros que não começam com um caráter.
(para evitar confusão com os diretórios.
e..
presentes em todos os diretórios Unix). A CLI gcloud oferece este mesmo comportamento quando usa carateres universais num URI do sistema de ficheiros, mas não oferece este comportamento em URIs da nuvem. Por exemplo, o seguinte comando copia todos os objetos degs://bucket1
parags://bucket2
:gcloud storage cp gs://bucket1/* gs://bucket2
No entanto, o seguinte comando copia apenas os ficheiros que não começam com a
.
do diretóriodir
parags://bucket1
:gcloud storage cp dir/* gs://bucket1
Considerações de eficiência
É mais eficiente, mais rápido e menos intensivo em termos de tráfego de rede usar carateres universais que tenham um prefixo de nome de objeto sem carateres universais, como:
gs://bucket/abc*.txt
do que usar carateres universais como a primeira parte do nome do objeto, como:
gs://bucket/*abc.txt
Isto deve-se ao facto de o pedido de
gs://bucket/abc*.txt
pedir ao servidor para enviar de volta o subconjunto de resultados cujo nome do objeto começa comabc
na raiz do contentor e, em seguida, filtra a lista de resultados para objetos cujo nome termina com.txt
. Por outro lado,gs://bucket/*abc.txt
pede ao servidor a lista completa de objetos na raiz do contentor e, em seguida, filtra os objetos cujo nome termina comabc.txt
. Esta consideração de eficiência torna-se cada vez mais percetível quando usa contentores com milhares ou mais objetos. Por vezes, é possível configurar os nomes dos objetos para se ajustarem aos padrões de correspondência com carateres universais esperados para tirar partido da eficiência da realização de pedidos de prefixos do lado do servidor.Suponhamos que tem um contentor com estes objetos:
gs://bucket/obj1 gs://bucket/obj2 gs://bucket/obj3 gs://bucket/obj4 gs://bucket/dir1/obj5 gs://bucket/dir2/obj6
Se executar o comando:
gcloud storage ls gs://bucket/*/obj5
gcloud storage
realiza uma listagem de segmentos de nível superior delimitada por/
e, em seguida, uma listagem de segmentos para cada subdiretório, num total de 3 listagens de segmentos:GET /bucket/?delimiter=/ GET /bucket/?prefix=dir1/obj5&delimiter=/ GET /bucket/?prefix=dir2/obj5&delimiter=/
Quanto mais fichas de contentores o caráter universal exigir, mais lento e caro se torna. O número de fichas de contentores necessárias aumenta à medida que:
O número de componentes de carateres universais (por exemplo,
gs://bucket/a??b/c*/*/d
tem 3 componentes com carateres universais);O número de subdiretórios que correspondem a cada componente; e
O número de resultados (a paginação é implementada quando o número de resultados é demasiado grande, especificando marcadores para cada um).
Se quiser usar um caráter universal no meio do caminho, experimente usar um caráter universal recursivo. Por exemplo:
gcloud storage ls gs://bucket/**/obj5
Isto corresponde a mais objetos do que
gs://bucket/*/obj5
(uma vez que abrange diretórios), mas é implementado através de um pedido de listagem de contentores sem delimitador (o que significa menos pedidos de contentores, embora liste o contentor inteiro e filtre localmente, o que pode exigir uma quantidade não trivial de tráfego de rede).