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 modelli di denominazione specificati. Questa pagina descrive i caratteri jolly supportati e indica considerazioni importanti quando vengono utilizzati 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 limiti della directory. Se utilizzato come parte di un percorso di 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** no.
? 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 un singolo carattere vocale seguito da .txt.
[CHARACTER_RANGE] Trova una corrispondenza con uno qualsiasi dei caratteri dell'intervallo. Ad esempio, gs://bucket/[a-e].txt trova gli 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 attive degli oggetti.

gcloud CLI supporta gli stessi caratteri jolly per i nomi di oggetti e file. Pertanto, 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 sorprendente:

  • Quando utilizzi 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 flag. Se un comando non include un flag di progetto o non supporta l'utilizzo 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 doveva fare riferimento a un oggetto cloud, ciò può comportare errori "Non trovato" sorprendenti. Ad esempio, la shell potrebbe tentare di espandere il carattere jolly gs://my-bucket/* sulla macchina locale, che non corrisponderebbe a nessun file locale, causando l'errore del comando.

    Inoltre, alcune shell includono altri caratteri nei relativi set di caratteri jolly. Ad esempio, se utilizzi zsh con l'opzione extendedglob attivata, # viene considerato un carattere speciale, il che è in conflitto con l'utilizzo di questo carattere per fare riferimento a oggetti con controllo delle versioni (vedi Ripristinare le versioni non correnti degli oggetti 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 che contiene caratteri jolly non funzionerà, perché gli strumenti a riga di comando tentano di espandere i caratteri jolly anziché utilizzarli come caratteri letterali. Ad esempio, l'esecuzione del comando:

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

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

    gcloud CLI non supporta una modalità "raw" che le consenta di utilizzare nomi di file che contengono caratteri jolly. Per questi file, devi utilizzare un altro strumento, ad esempio la console Google Cloud , oppure 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 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). gcloud CLI offre lo stesso comportamento quando utilizza caratteri jolly su un URI del file system, ma non lo offre sugli 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 intensivo in termini di traffico di rete utilizzare caratteri 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 restituire il sottoinsieme di risultati il cui nome dell'oggetto inizia con abc nella radice del bucket, quindi filtra l'elenco dei risultati per gli oggetti il cui nome termina con .txt. Al contrario, gs://bucket/*abc.txt chiede al server l'elenco completo degli oggetti nella radice del bucket, quindi filtra gli oggetti il cui nome termina con abc.txt. Questa considerazione sull'efficienza diventa sempre più evidente quando utilizzi bucket contenenti migliaia o più oggetti. A volte è possibile configurare i nomi degli oggetti in modo che corrispondano ai pattern di corrispondenza con caratteri jolly previsti per sfruttare l'efficienza delle richieste di prefisso lato server.

  • Supponiamo 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 delimitati da / e poi un elenco di bucket per ogni sottodirectory, per un totale di tre elenchi di bucket:

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

    Più elenchi di bucket richiede il carattere jolly, più lento e costoso diventa. Il numero di elenchi di bucket richiesti aumenta come segue:

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

    • il numero di sottodirectory che corrispondono a ciascun componente;

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

    Se vuoi utilizzare un carattere jolly nel percorso, prova a utilizzare un carattere jolly ricorsivo, ad esempio:

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

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