와일드 카드 이름

설명

gsutil은 URI 와일드 카드를 지원합니다. 예를 들어 명령어는 다음과 같습니다.

gsutil cp gs://bucket/data/abc* .

gs://bucket/data/abc로 시작하는 모든 객체와 해당 하위 디렉터리 내의 문자 수를 복사합니다.

디렉터리별 및 재귀 와일드 카드 비교

'*' 와일드 카드는 하위 디렉터리 내의 경로 끝에만 일치합니다. 예를 들어 버킷에 gs://bucket/data/abcd, gs://bucket/data/abcdef, gs://bucket/data/abcxyx라는 객체와 하위 디렉터리(gs://bucket/data/abc/def)의 객체가 포함되어 있는 경우 위의 gsutil cp 명령어는 처음 3개의 객체 이름과 일치하지만 마지막 객체 이름과는 일치하지 않습니다.

일치 항목이 디렉터리 경계를 포괄하도록 하려면 '**' 와일드 카드를 사용합니다.

gsutil cp gs://bucket/data/abc** .

위의 모든 객체 4개와 일치하게 됩니다.

gsutil은 객체와 파일 이름 모두에 동일한 와일드 카드를 지원합니다. 따라서 예를 들면 다음과 같습니다.

gsutil cp data/abc* gs://bucket

로컬 파일 시스템의 모든 이름과 일치하게 됩니다. 대부분의 명령어 셸은 와일드 카드도 지원하므로, gsutil을 실행하기 전에 위의 명령어를 실행하면 셸이 일치 항목을 확장할 수 있습니다. 그러나 대부분의 셸은 재귀 와일드 카드('**')를 지원하지 않습니다. 인수를 작은 따옴표로 구분하여 해당 셸에 작동하도록 gsutil의 와일드 카드 지원을 가능하게 할 수 있으므로 이러한 셸이 gsutil에 전달되기 전에 해석되지 않습니다.

gsutil cp 'data/abc**' gs://bucket

버킷 와일드 카드

단일 프로젝트 내에서 버킷 이름에 와일드 카드를 지정할 수 있습니다. 예를 들면 다음과 같습니다.

gsutil ls gs://data*.example.com

기본 프로젝트에서 이름이 'data'로 시작하고 '.example.com'으로 끝나는 모든 버킷의 콘텐츠가 나열됩니다. -p 옵션을 사용하여 기본값 이외의 프로젝트를 지정할 수 있습니다. 예를 들면 다음과 같습니다.

gsutil ls -p other-project gs://data*.example.com

버킷 및 객체 이름 와일드 카드를 조합할 수도 있습니다. 예를 들어 이 명령어는 기본 프로젝트의 모든 Cloud Storage 버킷에 있는 모든 '.txt' 파일을 삭제합니다.

gsutil rm gs://*/**.txt

기타 와일드 카드 문자

'*' 외에도 다음과 같은 와일드 카드를 사용할 수 있습니다.

?
단일 문자와 일치합니다. 예를 들어 'gs://bucket/??.txt'는 두 문자를 뒤에 .txt가 포함된 객체와만 일치합니다.
[chars]
지정된 문자와 일치합니다. 예를 들어 'gs://bucket/[aeiou].txt'는 단일 모음 뒤에 .txt가 포함된 객체와 일치합니다.
[char range]
문자 범위를 일치시킵니다. 예를 들어 'gs://bucket/[a-m].txt'는 a, b, c, ... 또는 m을 포함하고 .txt로 끝나는 객체와 일치합니다.

와일드 카드를 조합하여 더 강력한 일치 항목을 제공할 수 있습니다. 예를 들면 다음과 같습니다.

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

와일드 카드를 사용 시 예기치 못하게 발생할 수 있는 잠재적 동작

와일드 카드를 사용하면 다음과 같은 예기치 못한 동작이 발생할 수 있습니다.

  1. bash 및 zsh와 같은 셸은 gsutil에 인수를 전달하기 전에 와일드 카드를 확장하려고 할 수 있습니다. 와일드 카드가 클라우드 객체를 참조해야 하는 경우 셸에서 '찾을 수 없음' 오류가 예기치 못하게 발생할 수 있습니다. 예를 들어 셸이 로컬 머신에서 'gs://my-bucket/*' 와일드 카드를 확장하려고 하면 일치하는 파일이 없어 명령어가 실패합니다.

    일부 셸에는 와일드 카드 문자 집합에 추가 문자가 포함되어 있습니다. 예를 들어 extendedglob 옵션을 사용 설정한 상태에서 zsh를 사용하는 경우, '#'를 특수문자로 취급하여 버전 관리된 객체를 참조 시 해당 문자 사용과 충돌합니다(자세한 내용은 이전 객체 버전 복사 참조).

    이러한 문제를 방지하려면 와일드 카드 표현식을 작은 따옴표(Linux) 또는 큰 따옴표(Windows)로 입력합니다.

  2. gsutil은 와일드 카드 문자를 리터럴 문자로 사용하는 대신 확장하려고 하므로 와일드 카드 문자가 포함된 파일 이름을 지정하려고 해도 작동하지 않습니다. 예를 들어 다음 명령어를 실행합니다.

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

    그러면 gsutil이 '[1]' 부분을 와일드 카드로 일치시키려고 시도합니다.

    gsutil에서 와일드 카드 문자가 포함된 파일 이름으로 작업할 수 있는 방법을 제공하는 'raw' 모드에 대한 미해결 문제가 있지만, 지원이 구현되기 전까지는 이러한 파일 이름으로 gsutil을 사용할 수 없습니다. 와일드 카드를 사용하여 이러한 파일의 이름을 지정할 수 있습니다. 예를 들어 위의 명령어를 다음으로 대체합니다.

    gsutil cp './file*1*' gs://my-bucket
    

    하지만 이러한 접근 방식은 일반적으로 사용하기 어려울 수 있습니다.

로컬 파일 시스템의 'Dot' 파일에 대한 다른 동작

표준 Unix 동작에 따라 모든 Unix 디렉터리에 있는 '.' 및 '..' 디렉터리와의 혼동을 피할 수 있도록 와일드 카드 '*'는 '.'으로 시작하지 않는 파일과만 일치합니다. gsutil은 파일 시스템 URI에 와일드 카드를 사용할 때 동일한 동작을 제공하지만 클라우드 URI에 대해서는 이 동작을 제공하지 않습니다. 예를 들어 다음 명령어는 gs://bucket1에서 gs://bucket2로 모든 객체를 복사합니다.

gsutil cp gs://bucket1/* gs://bucket2

다음 명령어는 '.'으로 시작하지 않는 파일만 'dir' 디렉터리에서 gs://bucket1로 복사합니다.

gsutil cp dir/* gs://bucket1

효율성 고려사항: 여러 객체에 와일드 카드 사용

와일드 카드가 아닌 객체 이름 프리픽스가 있는 다음과 같은 와일드 카드를 사용하는 경우 보다 효율적이고, 빠르며, 네트워크 트래픽도 줄어듭니다. 예를 들면 다음과 같습니다.

gs://bucket/abc*.txt

와일드 카드를 객체 이름의 첫 번째 부분으로 사용하면 다음과 같습니다.

gs://bucket/*abc.txt

이는 'gs://bucket/abc*.txt' 요청이 버킷 루트에서 객체 이름이 'abc'로 시작하는 결과의 하위 집합을 서버에 전송하도록 요청한 후 gsutil이 이름이 '.txt'로 끝나는 객체의 결과 목록을 필터링하기 때문입니다. 반대로 'gs://bucket/*abc.txt'는 서버에 버킷 루트의 전체 객체 목록을 요청한 다음 이름이 'abc.txt'로 끝나는 객체를 필터링합니다. 이러한 효율성 고려사항은 수천 개 이상의 객체가 포함된 버킷을 사용할 때 더욱 두드러집니다. 서버 측 프리픽스 요청의 효율성을 활용하기 위해 예상되는 와일드 카드 일치 패턴에 맞게 객체 이름을 설정할 수도 있습니다. 구체적인 사용 사례의 예시는 gsutil 도움말: 프로덕션을 참조하세요.

효율성 고려사항: 중간 경로 와일드 카드 사용

다음 객체가 포함된 버킷이 있다고 가정해 보겠습니다.

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

다음 명령어를 실행합니다.

gsutil ls gs://bucket/*/obj5

그러면 gsutil은 /로 구분된 최상위 버킷 목록을 수행한 다음 하위 디렉터리당 하나의 버킷 목록을 수행하여 총 3개의 버킷 목록을 만듭니다.

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

와일드 카드가 필요한 버킷 수가 많을수록 속도가 더 높아지고 비용이 더 많이 듭니다. 필요한 버킷 목록 수는 다음과 같이 증가합니다.

  • 와일드 카드 구성요소의 수(예: 'gs://bucket/a??b/c*/*/d'에는 3개의 와일드 카드 구성요소가 있음)
  • 각 구성요소와 일치하는 하위 디렉터리의 수
  • 결과 수(결과 1,000개당 하나의 GET 요청을 사용하여 페이지 나누기를 구현하며 각 페이지에 마커 지정)

중간 경로 와일드 카드를 사용하려는 경우 재귀 와일드 카드를 대신 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

gsutil ls gs://bucket/**/obj5

이는 디렉터리를 포괄하므로 'gs://bucket/*/obj5'보다 많은 객체와 일치하지만, 구분 기호가 없는 버킷 나열 요청을 사용하여 구현됩니다. 즉, 더 적은 버킷 요청을 의미하나 전체 버킷과 필터를 로컬에서 나열하므로 상당한 네트워크 트래픽을 유발합니다.