Caratteri jolly URI

Google Cloud CLI supporta l'utilizzo di caratteri jolly URI per file, bucket e oggetti. I caratteri jolly ti consentono di lavorare in modo efficiente con gruppi di file che corrispondono a pattern di denominazione specificati. Questa pagina descrive i caratteri jolly supportati e riporta considerazioni importanti sull'utilizzo dei 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. Nel caso di comandi di elenco come ls, se un * finale corrisponde a una sottodirectory nel livello di directory corrente, vengono elencati anche i contenuti della sottodirectory.
** Corrisponde a zero o più caratteri oltre i confini delle directory. Se utilizzata all'interno di un percorso file locale, la sostituzione ** deve sempre essere preceduta da un delimitatore di directory. Ad esempio, my-directory/**.txt è valido, ma my-directory/abc** non lo è.
? Corrisponde a un singolo carattere. Ad esempio, gs://bucket/??.txt corrisponde solo agli oggetti con esattamente due caratteri seguiti da .txt.
[CHARACTERS] Corrisponde a uno qualsiasi dei caratteri specificati. Ad esempio, gs://bucket/[aeiou].txt corrisponde agli oggetti che contengono una singola vocale seguita da .txt.
[CHARACTER_RANGE] Corrisponde a qualsiasi carattere dell'intervallo. Ad esempio, gs://bucket/[a-e].txt corrisponde agli oggetti che contengono la lettera a, b, c, d o e seguita da .txt.

Puoi combinare i caratteri jolly per ottenere 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 non correnti degli oggetti nei risultati, questi caratteri jolly corrispondono solo alle versioni degli oggetti attivi.

Gcloud CLI supporta gli stessi caratteri jolly sia per i nomi degli oggetti sia per quelli dei file. Ad esempio:

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

corrisponde a 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ò comportare un comportamento inaspettato:

  • Quando utilizzi i caratteri jolly nei nomi dei bucket, le corrispondenze sono limitate ai bucket di un singolo progetto. Molti comandi ti consentono di specificare un progetto utilizzando un opzione. Se un comando non include un flag del progetto o non supporta l'uso di un flag del 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 gcloud CLI. Se il carattere jolly doveva fare riferimento a un oggetto cloud, possono verificarsi errori "Non trovato" inaspettati. Ad esempio, la shell potrebbe provare a espandere il carattere jolly gs://my-bucket/* sulla macchina locale, il che non corrisponderebbe a nessun file locale e causerebbe l'errore del comando.

    Inoltre, alcune shell includono altri caratteri nei loro set di caratteri jolly. Ad esempio, se utilizzi zsh con l'opzione extendedglob attivata, # viene trattato come un carattere speciale, in conflitto con l'utilizzo di questo carattere per fare riferimento a oggetti con versione (consulta Ripristinare le versioni degli oggetti non correnti per un esempio).

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

  • Il tentativo di specificare un nome file contenente caratteri jolly non funzionerà, poiché gli strumenti a riga di comando tentano di espandere i caratteri jolly anziché utilizzarli come caratteri letterali. Ad esempio, esegui il comando:

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

    non copia mai un file locale denominato file[1]. Gcloud CLI, invece, tratta sempre [1] come un carattere jolly.

    La gcloud CLI non supporta una modalità "non elaborata" che consenta di lavorare con nomi di file contenenti caratteri jolly. Per questi file, devi utilizzare uno strumento diverso, come la console Google Cloud, o una wildcard per acquisirli. 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 standard di Unix, il carattere jolly * corrisponde solo ai file che non iniziano con un carattere . (per evitare confusione con le directory . e .. presenti in tutte le directory Unix). La gcloud CLI offre lo stesso comportamento quando si utilizzano caratteri jolly in un URI del file system, ma non negli 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 . dalla directory dir a gs://bucket1:

    gcloud storage cp dir/* gs://bucket1

Considerazioni sull'efficienza

  • È più efficiente, più veloce e meno dispendioso in termini di traffico di rete utilizzare gli elementi jolly con un prefisso del nome dell'oggetto non jolly, ad esempio:

    gs://bucket/abc*.txt

    rispetto all'utilizzo di caratteri jolly come prima parte del nome dell'oggetto, ad esempio:

    gs://bucket/*abc.txt

    Questo perché la richiesta di gs://bucket/abc*.txt chiede al server di inviare nuovamente il sottoinsieme di risultati il cui nome dell'oggetto inizia con abc nella radice del bucket e poi 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 directory principale del bucket, quindi filtra per gli oggetti il cui nome termina con abc.txt. Questo aspetto dell'efficienza diventa sempre più evidente quando utilizzi bucket contenenti migliaia o più oggetti. A volte è possibile impostare i nomi degli oggetti in modo che corrispondano ai pattern di corrispondenza dei caratteri jolly previsti per sfruttare l'efficienza delle richieste di prefisso lato server.

  • Supponiamo che tu abbia 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 una voce del bucket di primo livello separata da / e poi una voce del bucket per ogni sottodirectory, per un totale di 3 voci del bucket:

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

    Più schede del bucket sono necessarie per il carattere jolly, più lenta e costosa sarà la pubblicazione. Il numero di schede del bucket richieste aumenta in base a quanto segue:

    • il numero di componenti jolly (ad es. gs://bucket/a??b/c*/*/d ha 3 componenti jolly);

    • il numero di sottodirectory corrispondenti a ciascun componente.

    • il numero di risultati (l'impaginazione viene implementata quando il numero di risultati è troppo elevato, specificando gli indicatori per ciascuno).

    Se vuoi utilizzare un carattere jolly intermedio, puoi provare a utilizzare un carattere jolly ricorsivo, ad esempio:

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

    Corrisponde a più oggetti rispetto a gs://bucket/*/obj5 (poiché si estende su più directory), ma viene implementato utilizzando una richiesta di elenco del bucket senza delimitatori (il che significa meno richieste del bucket, anche se elenca l'intero bucket e filtra localmente, quindi potrebbe richiedere una quantità non trascurabile di traffico di rete).