通过Java中的GCS特定表达式列出文件

时间:2017-07-11 14:38:28

标签: google-cloud-storage google-cloud-dataflow

之前有没有人实现过此功能?它相当于unix中的{{1}},我想在我的云数据流代码中实现相同的功能。 任何领导都将不胜感激。

谢谢。

3 个答案:

答案 0 :(得分:3)

可以在客户端进行此过滤。以下是使用google-cloud Java客户端库访问Google云端存储API的示例。

下面的示例列出了存储桶根目录中与给定正则表达式模式匹配的所有文件。

我使用正则表达式而不是像ls这样的shell命令支持的glob模式,因为正则表达式更灵活。

我建议您浏览java library documentation for google-cloud

实施例

import com.google.api.gax.paging.Page;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.Storage.BlobListOption;
import com.google.cloud.storage.StorageOptions;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * An example which lists the files in the specified GCS bucket matching the
 * specified regular expression pattern.
 *
 * <p>Run it as PROGRAM_NAME <BUCKET_NAME> <REGEX_MATCH_PATTERN>
 */
public class ListBlobsSample {
  public static void main(String[] args) throws IOException {
    // Instantiates a Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name of the GCS bucket
    String bucketName = args[0];
    // The regular expression for matching blobs in the GCS bucket.
    // Example: '.*abc.*'
    String matchExpr = args[1];

    List<String> results = listBlobs(storage, bucketName, Pattern.compile(matchExpr));
    System.out.println("Results: " + results.size() + " items.");
    for (String result : results) {
      System.out.println("Blob: " + result);
    }
  }

  // Lists all blobs in the bucket matching the expression.
  // Specify a regex here. Example: '.*abc.*'
  private static List<String> listBlobs(Storage storage, String bucketName, Pattern matchPattern)
      throws IOException {
    List<String> results = new ArrayList<>();

    // Only list blobs in the current directory
    // (otherwise you also get results from the sub-directories).
    BlobListOption listOptions = BlobListOption.currentDirectory();
    Page<Blob> blobs = storage.list(bucketName, listOptions);
    for (Blob blob : blobs.iterateAll()) {
      if (!blob.isDirectory() && matchPattern.matcher(blob.getName()).matches()) {
        results.add(blob.getName());
      }
    }
    return results;
  }
}

仅使用前缀匹配

如果您只需要匹配对象名称中的前缀,Objects: list API支持它。

执行prefix时,您需要在请求中指定GET https://www.googleapis.com/storage/v1/b/bucket/o查询参数。使用java客户端库也支持这一点(在构建传递给BlobListOption的{​​{1}}时必须指定它。

  

<强>前缀

     

的字符串

     

将结果过滤到名称以此前缀开头的对象。

的gsutil

storage.list()支持此类查询,它仅在客户端进行过滤(在某些情况下,它也会发出多个请求)。

答案 1 :(得分:0)

GCS支持前缀查询,可以高效列出xyz *;但要列出 xyz ,您必须列出整个存储桶并在客户端过滤。

答案 2 :(得分:0)

以下内容对您的用例可能并不完全有用,但如果您希望通过某个前缀缩小结果范围,然后应用正则表达式来匹配最终的正则表达式。

 Storage storage = StorageOptions.getDefaultInstance().getService();
 Bucket bucket = storage.get(bucketName)
 BlobListOption blobListOption = Storage.BlobListOption.prefix(prefixPattern)
 for (Blob blob : bucket.list(blobListOption).iterateAll()) {
    System.out.println(blob);
 }