Caratteri jolly URI

Google Cloud CLI supporta l'utilizzo di caratteri jolly URI per file, bucket e oggetti. I caratteri jolly consentono di lavorare in modo efficiente con gruppi di file che corrispondono a pattern di denominazione specificati. In questa pagina vengono descritti i caratteri jolly supportati e vengono indicate considerazioni importanti quando si utilizzano i caratteri jolly nei comandi.

Caratteri jolly

gcloud CLI supporta i seguenti caratteri jolly:

Basato su caratteri Descrizione
* Corrisponde a zero o più caratteri all'interno del livello di directory corrente. Ad esempio, cp gs://my-bucket/abc/d* corrisponde all'oggetto abc/def.txt, ma non all'oggetto abc/def/g.txt. Se visualizzi un elenco di comandi come ls, se un elemento * finale corrisponde a una sottodirectory nel livello di directory corrente, vengono elencati anche i contenuti della sottodirectory.
** Trova zero o più caratteri oltre i limiti della directory. Se utilizzato come parte di un percorso file locale, il carattere jolly ** deve sempre essere immediatamente preceduto da un delimitatore di directory. Ad esempio, my-directory/**.txt è valido, ma my-directory/abc** non lo è.
? Deve corrispondere a un singolo carattere. Ad esempio, gs://bucket/??.txt trova corrispondenze solo per oggetti con esattamente due caratteri seguiti da .txt.
[CHARACTERS] Deve corrispondere a uno qualsiasi dei caratteri specificati. Ad esempio, gs://bucket/[aeiou].txt trova corrispondenze con oggetti che contengono un singolo carattere vocale seguito da .txt.
[CHARACTER_RANGE] Deve corrispondere a uno qualsiasi degli intervalli di caratteri. Ad esempio, gs://bucket/[a-e].txt trova corrispondenze per oggetti contenenti le lettere a, b, c, d o e seguite da .txt.

Puoi combinare caratteri jolly per fornire corrispondenze più efficaci, ad esempio:

gs://*/[a-m]??.j*g

Tieni presente che, a meno che il comando non includa un flag per restituire versioni di oggetti non correnti nei risultati, questi caratteri jolly corrispondono solo alle versioni degli oggetti attivi.

gcloud CLI supporta gli stessi caratteri jolly per nomi di file e oggetti. Pertanto, ad esempio:

gcloud storage cp data/abc* gs://bucket

trova la corrispondenza con tutti i file che iniziano con abc nella directory data del file system locale.

Considerazioni sul comportamento

Esistono diversi casi in cui l'utilizzo di caratteri jolly può portare a un comportamento sorprendente:

  • Quando utilizzi caratteri jolly nei nomi dei bucket, le corrispondenze sono limitate ai bucket in un singolo progetto. Molti comandi consentono di specificare un progetto utilizzando un flag. Se un comando non include un flag di progetto o non supporta l'uso di un flag di progetto, le corrispondenze sono limitate ai bucket nel progetto predefinito.

  • Le shell (come bash e zsh) possono tentare di espandere i caratteri jolly prima di passare gli argomenti a gcloud CLI. Se il carattere jolly avrebbe dovuto fare riferimento a un oggetto cloud, potrebbero verificarsi sorprendenti errori di tipo "Non trovato". Ad esempio, la shell potrebbe tentare di espandere il carattere jolly gs://my-bucket/* sulla macchina locale, il che non corrisponderebbe a file locali, causando un errore del comando.

    Inoltre, alcune shell includono altri caratteri nei loro set di caratteri jolly. Ad esempio, se utilizzi zsh con l'opzione extglobl abilitata, il carattere # viene considerato come un carattere speciale, con conseguente conflitto con l'utilizzo del carattere quando fa riferimento agli oggetti sottoposti al controllo delle versioni (per un esempio, consulta Ripristinare le versioni degli oggetti non correnti).

    Per evitare questi problemi, racchiudi l'espressione con caratteri jolly tra virgolette singole (su Linux) o doppie virgolette (su Windows).

  • Il tentativo di specificare un nome file che contiene caratteri jolly non funzionerà, perché gli strumenti a riga di comando tentano di espandere i caratteri jolly invece di utilizzarli come caratteri letterali. Ad esempio, eseguendo il comando:

    gcloud storage cp './file[1]' gs://my-bucket

    non copia mai un file locale denominato file[1]. Al contrario, l'gcloud CLI considera sempre [1] come un carattere jolly.

    gcloud CLI non supporta una modalità "raw" che gli consente di lavorare con nomi di file che contengono caratteri jolly. Per questi file, devi utilizzare uno strumento diverso, come la console Google Cloud, o utilizzare un carattere jolly per acquisire i file. Ad esempio, per acquisire un file denominato file[1], puoi utilizzare il seguente comando:

    gcloud storage cp './file*1*' gs://my-bucket
  • In base al comportamento Unix standard, il carattere jolly * trova solo corrispondenze per i file che non iniziano con un carattere . (per evitare confusione con le directory . e .. presenti in tutte le directory Unix). gcloud CLI offre questo stesso comportamento quando si utilizzano caratteri jolly su un URI del file system, ma non per gli URI cloud. Ad esempio, il seguente comando copia tutti gli oggetti da gs://bucket1 a gs://bucket2:

    gcloud storage cp gs://bucket1/* gs://bucket2

    Tuttavia, il seguente comando copia solo i file che non iniziano con un . dalla directory dir a gs://bucket1:

    gcloud storage cp dir/* gs://bucket1

Considerazioni sull'efficienza

  • È più efficiente, veloce e meno impegnativo in termini di traffico di rete utilizzare caratteri jolly che hanno un prefisso del nome dell'oggetto senza caratteri jolly, ad esempio:

    gs://bucket/abc*.txt

    è necessario utilizzare caratteri jolly come prima parte del nome dell'oggetto, ad esempio:

    gs://bucket/*abc.txt

    Questo perché la richiesta per gs://bucket/abc*.txt chiede al server di inviare il sottoinsieme di risultati il cui nome oggetto inizia con abc nella directory principale del bucket, quindi filtra l'elenco dei risultati in base agli oggetti il cui nome termina con .txt. Al contrario, gs://bucket/*abc.txt richiede al server l'elenco completo degli oggetti nella radice del bucket e filtra gli oggetti il cui nome termina con abc.txt. Questa considerazione dell'efficienza è sempre più evidente quando si utilizzano bucket contenenti migliaia o più oggetti. A volte è possibile configurare i nomi degli oggetti in modo che si adattino ai pattern di corrispondenza dei caratteri jolly previsti per sfruttare l'efficienza delle richieste di prefisso lato server.

  • Supponi di avere un bucket con questi oggetti:

    gs://bucket/obj1
    gs://bucket/obj2
    gs://bucket/obj3
    gs://bucket/obj4
    gs://bucket/dir1/obj5
    gs://bucket/dir2/obj6

    Se esegui il comando:

    gcloud storage ls gs://bucket/*/obj5

    gcloud storage esegue un elenco di bucket di primo livello delimitato da / e poi un elenco di bucket per ogni sottodirectory, per un totale di tre schede di bucket:

    GET /bucket/?delimiter=/
    GET /bucket/?prefix=dir1/obj5&delimiter=/
    GET /bucket/?prefix=dir2/obj5&delimiter=/
    

    Maggiore è il numero di elenchi di bucket richiesti dal carattere jolly, più diventa lento e costoso. Il numero di schede di bucket richieste cresce come segue:

    • Il numero di componenti con caratteri jolly (ad es. gs://bucket/a??b/c*/*/d ha tre componenti con caratteri jolly);

    • il numero di sottodirectory che corrispondono a ogni componente; e

    • il numero di risultati (la paginazione viene implementata quando il numero di risultati è troppo grande e vengono specificati indicatori per ciascuno).

    Se vuoi utilizzare un carattere jolly a metà percorso, potresti provare a usare un carattere jolly ricorsivo, ad esempio:

    gcloud storage ls gs://bucket/**/obj5

    Questa corrispondenza corrisponde a più oggetti di gs://bucket/*/obj5 (poiché si estende le directory), ma viene implementata utilizzando una richiesta di elenco dei bucket senza delimitatori (il che significa meno richieste di bucket, anche se l'intero bucket e i filtri vengono elencati localmente, il che potrebbe richiedere una quantità non banale di traffico di rete).