Кто-нибудь достигал этой функции раньше? Это эквивалентно ls -ltr *xyz* в unix, и я хотел бы добиться того же в моем коде потока данных облака. Любое руководство будет оценено по достоинству.

Спасибо.

1
Balajee Venkatesh 11 Июл 2017 в 17:38

3 ответа

Эту фильтрацию можно выполнить на стороне клиента. Вот пример использования клиентской библиотеки Java google-cloud для доступа к API Google Cloud Storage.

В приведенном ниже примере перечислены все файлы в корневом каталоге корзины, соответствующие заданному шаблону регулярного выражения.

Я использовал регулярные выражения вместо шаблона глобуса, который поддерживают такие команды оболочки, как ls, поскольку регулярные выражения более гибкие.

Я бы порекомендовал вам ознакомиться с документацией по библиотеке java для 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 поддерживает это.

При выполнении GET https://www.googleapis.com/storage/v1/b/bucket/o в запросе необходимо указать параметр запроса prefix. Это также поддерживается с помощью клиентской библиотеки java (вам нужно будет указать это при создании BlobListOption, передаваемого в storage.list()).

префикс

строка

Отфильтруйте результаты по объектам, имена которых начинаются с этого префикса.

Gsutil

gsutil поддерживает такие запросы и выполняет фильтрацию исключительно на стороне клиента (в некоторых случаях он также выдает несколько запросов).

2
Tuxdude 12 Июл 2017 в 07:36
- Я добавил очень простой, но рабочий пример, который использует сопоставление результатов с образцом регулярного выражения, а также добавил ссылку на документацию библиотеки java для дальнейшего использования.
 – 
Tuxdude
12 Июл 2017 в 07:37
Спасибо за вашу помощь, но, приложив много усилий, я не смог заставить его работать в моем Eclipse. Я предполагаю, что это проблемы с версиями jar, которые я использую для разрешения зависимостей. Обычно классы StorageOptions и Page находятся под красными линиями. Не могли бы вы поделиться версиями jar-файлов, связанных с gax и хранилищем, которые вы использовали для обеспечения функциональности этого кода?
 – 
Balajee Venkatesh
12 Июл 2017 в 10:34
Я бы порекомендовал изучить какой-нибудь инструмент управления зависимостями / пакетами, например maven, который позволяет легко извлекать зависимости. Причина в том, что вам нужно будет загрузить целый набор jar-файлов, чтобы удовлетворить все зависимости (т.е. зависимости ваших зависимостей и т. Д.). Если вы используете maven или какой-либо из популярных инструментов управления зависимостями Java, строки, которые вам нужно добавить в конфигурацию для извлечения зависимостей, перечислены в списке здесь
 – 
Tuxdude
12 Июл 2017 в 18:31
- Проблема, с которой вы столкнулись, сильно отличается от вашего первоначального вопроса, и я бы предложил задать отдельный вопрос, если у вас есть проблемы со сборкой проекта и обработкой зависимостей.
 – 
Tuxdude
12 Июл 2017 в 18:37

GCS поддерживает префиксные запросы, вы можете эффективно отображать xyz *; но чтобы перечислить xyz , вам нужно будет перечислить всю корзину и отфильтровать на клиенте.

0
Mike Schwartz 11 Июл 2017 в 18:33

Следующее может быть не совсем полезным для вашего варианта использования, но если вы хотите сузить результаты по определенному префиксу, а затем применить регулярное выражение для соответствия вашему окончательному регулярному выражению.

 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);
 }
0
Fayaz Ahmed 25 Авг 2017 в 02:22