之前有没有人实现过此功能?它相当于unix中的{{1}},我想在我的云数据流代码中实现相同的功能。 任何领导都将不胜感激。
谢谢。
答案 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}}时必须指定它。
<强>前缀强>
的字符串
将结果过滤到名称以此前缀开头的对象。
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);
}