すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS ディレクトリの管理

最終更新日:Apr 22, 2026

多数のオブジェクトをフラットな構造で保存すると、オブジェクトの検索が困難になり、一括操作が複雑になります。この問題に対処するため、Object Storage Service (OSS) は、フォルダ構造をシミュレートしてこれらのオブジェクトを整理・管理するディレクトリ機能を提供しています。

仕組み

OSS は FLAT ストレージを使用しており、実際のフォルダはありません。コンソール上のディレクトリは、オブジェクト名に含まれる / デリミタから生成されます。

たとえば、コンソールに次の階層が表示される場合:

examplebucket
    └── log/
       ├── date1.txt
       ├── date2.txt  
       ├── date3.txt
    └── destfolder/
       └── 2021/
          ├── photo.jpg

OSS に実際に保存されているオブジェクトは次のとおりです:

log/date1.txt
log/date2.txt
destfolder/2021/photo.jpg

ディレクトリの作成

ディレクトリは、次の方法で作成できます:

  • 自動作成:パスを含む名前のオブジェクトをアップロードすると、対応するディレクトリが自動的に作成されます。

  • 手動作成: この操作では、空のディレクトリのプレースホルダーとして、名前がフォワードスラッシュ (/) で終わる 0 バイトのオブジェクトを作成します。

    コンソール

    1. OSS コンソールにログインします。対象のバケットで、オブジェクト管理 > オブジェクトに移動します。

    2. ディレクトリの作成 をクリックします。

    3. ディレクトリ名を入力し、OKをクリックします。

      ディレクトリ名は、次のルールに従う必要があります:

      • ディレクトリ名は UTF-8 でエンコードする必要があり、絵文字を含めることはできません。

      • スラッシュ (/) は、ディレクトリ名でサブディレクトリを示すために使用されます。ディレクトリ名にスラッシュ (/) を使用して、ネストされたディレクトリ構造を作成します。ディレクトリ名をスラッシュ (/) またはバックスラッシュ (\) で始めることはできません。ディレクトリ名に連続したスラッシュ (//) を含めることはできません。

      • サブディレクトリ名に 2 つの連続したピリオド (..) を使用することはできません。

      • ディレクトリ名は 1~254 文字である必要があります。

    ossutil

    次の例では、examplebucket バケットに dir/ という名前のディレクトリを作成する方法を示します。

    ossutil mkdir oss://examplebucket/dir

    詳細については、「mkdir (ディレクトリの作成)」をご参照ください。

    SDK

    次の例は、一般的な SDK を使用してディレクトリを作成する方法を示しています。他の SDK を使用してディレクトリを作成する方法については、「OSS SDK の概要」をご参照ください。

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import java.io.ByteArrayInputStream;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            // エンドポイントを設定します。この例では、中国 (杭州) リージョンが使用されています。実際のエンドポイントを指定してください。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // セキュリティのため、アクセス認証情報をハードコーディングしないでください。認証情報が漏洩すると、すべてのリソースが危険にさらされる可能性があります。この例では、環境変数から認証情報を取得します。実行する前に、環境変数が設定されていることを確認してください。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // バケット名を指定します (例: examplebucket) 。
            String bucketName = "examplebucket";
            // 方法 1 のディレクトリ名を指定します。
            String dirName = "exampledir/";
            // 方法 2 のディレクトリ名を指定します。
            String dirName2 = "exampledir1/";
    
            // OSSClient インスタンスを作成します。
            OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
    
            try {
                // 方法 1: createDirectory 操作を呼び出してディレクトリを作成します。この方法を使用する前に、階層型名前空間を有効にする必要があります。
                ossClient.createDirectory(bucketName, dirName);
    
                // 方法 2: 空の文字列をアップロードしてディレクトリを作成します。
                ossClient.putObject(bucketName, dirName2, new ByteArrayInputStream("".getBytes()));
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }
    <?php
    if (is_file(__DIR__ . '/../autoload.php')) {
        require_once __DIR__ . '/../autoload.php';
    }
    if (is_file(__DIR__ . '/../vendor/autoload.php')) {
        require_once __DIR__ . '/../vendor/autoload.php';
    }
    
    use OSS\Credentials\EnvironmentVariableCredentialsProvider;
    use OSS\OssClient;
    use OSS\CoreOssException;
    // 環境変数からアクセス認証情報を取得します。この例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
    $provider = new EnvironmentVariableCredentialsProvider();
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は https://oss-cn-hangzhou.aliyuncs.com を使用します。
    $endpoint = "yourEndpoint";
    // バケット名を指定します (例: examplebucket) 。
    $bucket= "examplebucket";
    // ディレクトリ名を指定します。名前はスラッシュ (/) で終わる必要があります。
    $object = "exampledir/";
    $content = "";
    try{
        $config = array(
            "provider" => $provider,
            "endpoint" => $endpoint,
        );
        $ossClient = new OssClient($config);
    
        $ossClient->putObject($bucket, $object, $content);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . "OK" . "\n");
    
    // オブジェクトをアップロードする際に、アクセス権限を private に設定したり、カスタムメタデータを指定したりするなど、ヘッダーを設定できます。
    $options = array(
        OssClient::OSS_HEADERS => array(
            'x-oss-object-acl' => 'private',
            'x-oss-meta-info' => 'your info'
        ),
    );
    try{
        $config = array(
            "provider" => $provider,
            "endpoint" => $endpoint,
        );
        $ossClient = new OssClient($config);
    
        $ossClient->putObject($bucket, $object, $content, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . "OK" . "\n");           
    const OSS = require('ali-oss');
    
    const client = new OSS({
      // バケットが配置されているリージョンを指定します。たとえば、中国 (杭州) リージョンの場合は 'oss-cn-hangzhou' を使用します。
      region: 'yourregion',
      // 環境変数からアクセス認証情報を取得します。この例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      // バケット名を指定します。
      bucket: 'examplebucket',
    });
    
    async function putBuffer () {
      try {
        // ディレクトリ名を指定します。名前はスラッシュ (/) で終わる必要があります。
        const result = await client.put('exampledir/', new Buffer(''));
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }
    
    putBuffer();
    # -*- coding: utf-8 -*-
    
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 環境変数からアクセス認証情報を取得します。この例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は https://oss-cn-hangzhou.aliyuncs.com を使用します。
    # バケット名を指定します。
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    
    # ディレクトリ名を指定します。名前はスラッシュ (/) で終わる必要があります。
    bucket.put_object('exampledir/', '')    
    using System.Text;
    using Aliyun.OSS;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は https://oss-cn-hangzhou.aliyuncs.com を使用します。
    var endpoint = "yourEndpoint";
    // 環境変数からアクセス認証情報を取得します。この例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
    var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
    var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
    // バケット名を指定します (例: examplebucket) 。
    var bucketName = "examplebucket";
    // ディレクトリ名を指定します。名前はスラッシュ (/) で終わる必要があります。
    var objectName = "exampledir/";
    var objectContent = "";
    
    // OssClient インスタンスを作成します。
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    try
    {
        byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
        MemoryStream requestContent = new MemoryStream(binaryData);
        // ディレクトリを作成します。
        client.PutObject(bucketName, objectName, requestContent);
        Console.WriteLine("Put object succeeded");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Put object failed, {0}", ex.Message);
    }
    #include "oss_api.h"
    #include "aos_http_io.h"
    /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は https://oss-cn-hangzhou.aliyuncs.com を使用します。 */
    const char *endpoint = "yourEndpoint";
    
    /* バケット名を指定します (例: examplebucket) 。 */
    const char *bucket_name = "examplebucket";
    /* ディレクトリ名を指定します。名前はスラッシュ (/) で終わる必要があります。 */
    const char *object_name = "exampledir/";
    const char *object_content = "";
    void init_options(oss_request_options_t *options)
    {
        options->config = oss_config_create(options->pool);
        /* char* 文字列で aos_string_t 型を初期化します。 */
        aos_str_set(&options->config->endpoint, endpoint);
        /* 環境変数からアクセス認証情報を取得します。この例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */    
        aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
        aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
        /* CNAME を使用するかどうかを指定します。0 は CNAME を使用しないことを示します。 */
        options->config->is_cname = 0;
        /* タイムアウト期間などのネットワークパラメータを設定します。 */
        options->ctl = aos_http_controller_create(options->pool, 0);
    }
    int main(int argc, char *argv[])
    {
        /* プログラム起動時に aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。 */
        if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
            exit(1);
        }
        /* メモリプール (pool) は、apr_pool_t と同等で、メモリ管理に使用されます。apr ライブラリで実装されています。 */
        aos_pool_t *pool;
        /* メモリプールを作成します。2 番目のパラメータは NULL で、メモリプールが他のメモリプールから継承しないことを示します。 */
        aos_pool_create(&pool, NULL);
        /* オプションを作成して初期化します。このパラメータには、エンドポイント、access_key_id、access_key_secret、is_cname、curl などのグローバル設定情報が含まれます。 */
        oss_request_options_t *oss_client_options;
        /* メモリプールからオプションのメモリを割り当てます。 */
        oss_client_options = oss_request_options_create(pool);
        /* クライアントオプション oss_client_options を初期化します。 */
        init_options(oss_client_options);
        /* パラメータを初期化します。 */
        aos_string_t bucket;
        aos_string_t object;
        aos_list_t buffer;
        aos_buf_t *content = NULL;
        aos_table_t *headers = NULL;
        aos_table_t *resp_headers = NULL; 
        aos_status_t *resp_status = NULL; 
        aos_str_set(&bucket, bucket_name);
        aos_str_set(&object, object_name);
        aos_list_init(&buffer);
        content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
        aos_list_add_tail(&content->node, &buffer);
        /* オブジェクトをアップロードします。 */
        resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
        /* アップロードが成功したかどうかを確認します。 */
        if (aos_status_is_ok(resp_status)) {
            printf("put object from buffer succeeded\n");
        } else {
            printf("put object from buffer failed\n");      
        }
        /* メモリプールを破棄します。これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
        aos_pool_destroy(pool);
        /* 以前に割り当てられたグローバルリソースを解放します。 */
        aos_http_io_deinitialize();
        return 0;
    }

ディレクトリの名前変更

ディレクトリの名前変更は、単一のアトミック操作ではありません。使用するツールに関係なく、次の 2 段階のプロセスが含まれます:

  1. コピー:ソースディレクトリから新しい宛先ディレクトリにすべてのオブジェクトを再帰的にコピーします。

  2. 削除:コピー操作が成功したことを確認した後、ソースディレクトリとそこに含まれるすべてのオブジェクトを完全に削除します。

重要

名前変更にはディレクトリ内のすべてのオブジェクトのコピーと削除が必要なため、大規模なディレクトリでは操作に時間がかかり、API 呼び出しとデータ転送に多大なコストが発生します。続行する前に、影響を慎重に評価してください。

  • バケットで階層型名前空間が有効になっている場合は、ディレクトリを直接名前変更できます。

    コンソール

    1. OSS コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、バケット をクリックします。[バケット] ページで目的のバケットを探し、クリックします。

    3. 左側のナビゲーションウィンドウで、オブジェクト管理 > オブジェクト を選択します。

    4. ディレクトリの名前を変更または移動します。

      ossutil rm コマンドの prefix オプションにディレクトリ名を指定することで、指定したディレクトリを削除できます。詳細については、「rm (削除)」をご参照ください。

      シナリオ

      操作

      ディレクトリの名前変更

      対象のディレクトリにカーソルを合わせ、edit アイコンをクリックしてディレクトリの名前を変更します。ディレクトリ名はスラッシュ / で始めることはできません。

      ディレクトリの移動

      ディレクトリの移動は名前の変更と似ていますが、新しいディレクトリ名はスラッシュ (/) で始める必要があります。次のいずれかのシナリオに基づいて、対象のディレクトリを指定します:

      • 親ディレクトリ destdir から別の親ディレクトリ destfolder にサブディレクトリ subdir を移動する場合は、新しいディレクトリ名として /destfolder/subdir を入力します。

      • 親ディレクトリ destdir からバケットのルートディレクトリにサブディレクトリ subdir を移動する場合は、新しいディレクトリ名として /subdir を入力します。

    SDK

    ディレクトリの名前変更は、Java SDK 3.12.0 以降でのみサポートされています。

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            // yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
            String endPoint = "yourEndpoint";
            // 認証情報が漏洩するとリソースが危険にさらされるため、アクセス認証情報をハードコーディングしないでください。この例では、環境変数から認証情報を取得します。コードを実行する前に、変数が設定されていることを確認してください。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // バケット名を指定します。例: examplebucket。
            String bucketName = "examplebucket";
            // ソースディレクトリの絶対パスを指定します。絶対パスにバケット名を含めることはできません。
            String sourceDir = "exampledir";
            // 宛先ディレクトリの絶対パスを指定します。これはソースディレクトリと同じバケット内にある必要があります。絶対パスにバケット名を含めることはできません。
            String destinationDir = "newexampledir";
    
            // OSSClient インスタンスを作成します。
            OSS ossClient = new OSSClientBuilder().build(endPoint, credentialsProvider);
    
            try {
                // バケット内のソースディレクトリを宛先ディレクトリに名前変更します。
                RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceDir, destinationDir);
                ossClient.renameObject(renameObjectRequest);
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }

    API

    広範なカスタマイズが必要なアプリケーションでは、署名を手動で計算するコードを記述して、直接 REST API リクエストを行うことができます。詳細については、「RenameObject」をご参照ください。

  • 階層型名前空間が無効になっている場合は、ディレクトリ内のすべてのオブジェクトをリストし、新しいプレフィックスにコピーしてから、元のオブジェクトを削除することで、ディレクトリの名前を変更する必要があります。

    説明

    多数のオブジェクトをコピーする必要がある場合は、データオンライン移行を使用して一括コピーを実行できます。詳細については、「OSS バケット間のデータ移行」をご参照ください。

    ossutil

    ossutil を使用する場合、ディレクトリの名前を変更するには、コピー削除のステップを手動で実行する必要があります。

    1. オブジェクトのコピー
      examplebucket バケット内の old-dir/ ディレクトリから new-dir/ ディレクトリにすべてのコンテンツをコピーするには、--recursive (-r) オプションを指定して cp (オブジェクトのコピー) コマンドを使用します。

      ossutil cp oss://examplebucket/old-dir/ oss://examplebucket/new-dir/ -r
    2. (任意) コピー操作の検証
      ls (リソースのリスト) コマンドを使用して新しいディレクトリを確認し、すべてのオブジェクトが正常にコピーされたことを検証します。

      ossutil ls oss://examplebucket/new-dir/
    3. ソースディレクトリの削除
      コピーが成功したことを確認した後、rm (オブジェクトの削除) コマンドに --recursive (-r) オプションを指定して、ソースディレクトリ old-dir/ を削除します。

      警告

      この操作は、old-dir/ ディレクトリおよびその内部のすべてのオブジェクトを完全に削除します。この操作は元に戻すことはできません。慎重に実行してください。

      ossutil rm oss://examplebucket/old-dir/ -r

    SDK

    前述のとおり、SDK を使用してディレクトリの名前を変更するには、複数の API 呼び出しを組み合わせる必要があります。詳細については、これらのコア操作に関する SDK ドキュメントをご参照ください:

    API

    API を使用してディレクトリの名前を変更するには、次の API 呼び出しを組み合わせる必要があります:

ディレクトリの削除

警告

ディレクトリを削除すると、そのすべてのサブディレクトリとオブジェクトも削除されます。注意して実行してください。

コンソール

  1. OSS コンソールにログインします。

  2. 対象バケットの オブジェクト管理 > オブジェクト ページに移動します。

  3. 削除するディレクトリを選択し、[操作] 列の 完全に削除 をクリックします。

  4. 表示されるダイアログボックスで、OK をクリックします。

    重要

    削除中にタスクリストを更新したり閉じたりしないでください。タスクが中断される可能性があります。

Ossutil

次の例では、examplebucket バケットからディレクトリ test/ を削除する方法を示します。

ossutil rm oss://examplebucket/test/ -r

詳細については、「rm (削除)」をご参照ください。

SDK

Prefix を指定することで、ディレクトリとその中のすべてのオブジェクトを削除できます。 たとえば、examplebucket バケットから log ディレクトリとその中のすべてのオブジェクトを削除する場合、サンプルコードの Prefix パラメーターを Prefix log/ に設定します。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args) throws Exception {
        // 例として中国 (杭州) リージョンのエンドポイントを使用します。ご利用のバケットのリージョンのエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 漏洩によるセキュリティリスクを防ぐため、コードにアクセス認証情報をハードコーディングしないでください。この例では、環境変数から認証情報をロードします。コードを実行する前に、これらの変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket) 。
        String bucketName = "examplebucket";
        // ディレクトリの絶対パスを指定します。パスにバケット名を含めることはできません。
        String directoryName = "exampledir";
        // 削除するディレクトリの完全なパスを指定します。パスにバケット名を含めることはできません。
        final String prefix = "log/";

        // OSSClient インスタンスを作成します。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 方法 1: deleteDirectory 操作を呼び出してディレクトリを再帰的に削除します。この方法を使用する前に、階層型名前空間機能を有効にする必要があります。
            DeleteDirectoryRequest deleteDirectoryRequest = new DeleteDirectoryRequest(bucketName, directoryName);
            deleteDirectoryRequest.setDeleteRecursive(true);
            DeleteDirectoryResult deleteDirectoryResult = ossClient.deleteDirectory(deleteDirectoryRequest);

            // 削除結果を表示します。
            // 一度に最大 100 個のディレクトリとオブジェクトを削除できます。削除が不完全な場合、サーバーは `nextDeleteToken` を返します。このトークンを使用して、残りのアイテムの削除を続行します。
            // nextDeleteToken パラメータは、次の削除の開始点を指定します。
            String nextDeleteToken = deleteDirectoryResult.getNextDeleteToken();
            System.out.println("delete next token:" + nextDeleteToken);
            // 削除されたディレクトリの絶対パス。
            System.out.println("delete dir name :" + deleteDirectoryResult.getDirectoryName());
            // この操作で削除されたオブジェクトとディレクトリの総数。
            System.out.println("delete number:" + deleteDirectoryResult.getDeleteNumber());


            // 方法 2: listObjects 操作によって返された結果を反復処理して、ディレクトリとその中のすべてのオブジェクトを削除します。
            String nextMarker = null;
            ObjectListing objectListing = null;
            do {
                ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
                        .withPrefix(prefix)
                        .withMarker(nextMarker);

                objectListing = ossClient.listObjects(listObjectsRequest);
                if (objectListing.getObjectSummaries().size() > 0) {
                    List<String> keys = new ArrayList<String>();
                    for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
                        System.out.println("key name: " + s.getKey());
                        keys.add(s.getKey());
                    }
                    DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName).withKeys(keys).withEncodingType("url");
                    DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(deleteObjectsRequest);
                    List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
                    try {
                        for(String obj : deletedObjects) {
                            String deleteObj =  URLDecoder.decode(obj, "UTF-8");
                            System.out.println(deleteObj);
                        }
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }

                nextMarker = objectListing.getNextMarker();
            } while (objectListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
   require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
   require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
// この例では、環境変数からアクセス認証情報をロードします。実行する前に、`OSS_ACCESS_KEY_ID` と `OSS_ACCESS_KEY_SECRET` が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// ご利用のバケットのリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "your-endpoint";
// バケット名を指定します。
$bucket = "examplebucket";

try {
   $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
   $option = array(
      OssClient::OSS_MARKER => null,
      // 削除するディレクトリの完全なパスを指定します。パスにバケット名を含めることはできません。
      OssClient::OSS_PREFIX => "log/",
      OssClient::OSS_DELIMITER=>'',
   );
   $bool = true;
   while ($bool){
      $result = $ossClient->listObjects($bucket,$option);
      $objects = array();
      if(count($result->getObjectList()) > 0){
         foreach ($result->getObjectList() as $key => $info){
            printf("key name:".$info->getKey().PHP_EOL);
            $objects[] = $info->getKey();
         }
         // ディレクトリとその中のすべてのオブジェクトを削除します。
         $delObjects = $ossClient->deleteObjects($bucket, $objects);
         foreach ($delObjects as $info){
            $obj = strval($info);
            printf("Delete ".$obj." : Success" . PHP_EOL);
         }
      }

      if($result->getIsTruncated() === 'true'){
         $option[OssClient::OSS_MARKER] = $result->getNextMarker();
      }else{
         $bool = false;
      }
   }
   printf("Delete Objects : OK" . PHP_EOL);
} catch (OssException $e) {
   printf("Delete Objects : Failed" . PHP_EOL);
   printf($e->getMessage() . PHP_EOL);
   return;
}
const OSS = require('ali-oss');

const client = new OSS({
  // バケットが配置されているリージョンを指定します。たとえば、中国 (杭州) リージョンの場合は、リージョンを oss-cn-hangzhou に設定します。
  region: 'yourregion',
  // この例では、環境変数からアクセス認証情報をロードします。実行する前に、`OSS_ACCESS_KEY_ID` と `OSS_ACCESS_KEY_SECRET` が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // バケット名を指定します。
  bucket: 'yourbucketname'
});

// `promise.all` が中断されないように、失敗したリクエストを処理します。失敗の理由と削除に失敗したオブジェクトの名前を返します。
async function handleDel(name, options) {
  try {
    await client.delete(name);
  } catch (error) {
    error.failObjectName = name;
    return error;
  }
}

// 複数のオブジェクトを削除します。
async function deletePrefix(prefix) {
  const list = await client.list({
    prefix: prefix,
  });

  list.objects = list.objects || [];
  const result = await Promise.all(list.objects.map((v) => handleDel(v.name)));
  console.log(result);
}
// ディレクトリとその中のすべてのオブジェクトを削除します。
deletePrefix('log/')
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# この例では、環境変数からアクセス認証情報をロードします。実行する前に、`OSS_ACCESS_KEY_ID` と `OSS_ACCESS_KEY_SECRET` が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# ご利用のエンドポイントを、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
# バケット名を指定します。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
prefix = "exampledir/"

# ディレクトリとその中のすべてのオブジェクトを削除します。
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
    bucket.delete_object(obj.key)
package main

import (
    "fmt"
    "os"

    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // この例では、環境変数からアクセス認証情報をロードします。実行する前に、`OSS_ACCESS_KEY_ID` と `OSS_ACCESS_KEY_SECRET` が設定されていることを確認してください。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // OSSClient インスタンスを作成します。
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンのエンドポイントは `https://oss-cn-hangzhou.aliyuncs.com` です。これを実際にご利用のリージョンのエンドポイントに置き換えてください。
    client, err := oss.New("your-endpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // バケット名を指定します。
    bucket, err := client.Bucket("examplebucket")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    marker := oss.Marker("")
    // 削除するディレクトリの完全なパスを指定します。パスにバケット名を含めることはできません。
    prefix := oss.Prefix("log/")
    count := 0
    for {
        lor, err := bucket.ListObjects(marker, prefix)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }

        objects := []string{}
        for _, object := range lor.Objects {
            objects = append(objects, object.Key)
        }
        // ディレクトリとその中のすべてのオブジェクトを削除します。
        // `oss.DeleteObjectsQuiet` を `true` に設定して、削除結果を抑制します。
        delRes, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(true))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }

        if len(delRes.DeletedObjects) > 0 {
            fmt.Println("These objects failed to delete:", delRes.DeletedObjects)
            os.Exit(-1)
        }

        count += len(objects)

        prefix = oss.Prefix(lor.Prefix)
        marker = oss.Marker(lor.NextMarker)
        if !lor.IsTruncated {
            break
        }
    }
    fmt.Printf("success,total delete object count:%d\n", count)
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、中国 (杭州) リージョンの場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "your-endpoint";
    /* バケット名を指定します。 */
    std::string BucketName = "examplebucket";
    /* 削除するディレクトリの完全なパスを指定します。パスにバケット名を含めることはできません。 */
    std::string keyPrefix = "log/";

    /* ネットワークなどのリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    /* この例では、環境変数からアクセス認証情報をロードします。実行する前に、`OSS_ACCESS_KEY_ID` と `OSS_ACCESS_KEY_SECRET` が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    std::string nextMarker = "";
    bool isTruncated = false;
    do {            
            ListObjectsRequest request(BucketName);            
            request.setPrefix(keyPrefix);
            request.setMarker(nextMarker);
            auto outcome = client.ListObjects(request);

            if (!outcome.isSuccess()) {
                /* 例外を処理します。 */
                std::cout << "ListObjects fail" <<
                ",code:" << outcome.error().Code() <<
                ",message:" << outcome.error().Message() <<
                ",requestId:" << outcome.error().RequestId() << std::endl;
                break;
            }
            for (const auto& object : outcome.result().ObjectSummarys()) {
                DeleteObjectRequest request(BucketName, object.Key());
                /* ディレクトリとその中のすべてのオブジェクトを削除します。 */
                auto delResult = client.DeleteObject(request);
            }
            nextMarker = outcome.result().NextMarker();
            isTruncated = outcome.result().IsTruncated();
    } while (isTruncated);

    /* ネットワークなどのリソースを解放します。 */
    ShutdownSdk();
    return 0;
}

API

特定のアプリケーション要件については、REST API を直接呼び出すことができます。これには、リクエスト署名を手動で計算する必要があります。詳細については、「DeleteObject」API オペレーションをご参照ください。

オブジェクト数とサイズのクエリ

方法 1: オンデマンドでのオブジェクトのリスト

この方法は、10,000 未満のオブジェクトを持つディレクトリのオンデマンドクエリに最適です。

  1. ターゲットバケットの左側にあるナビゲーションウィンドウで、オブジェクト管理 > オブジェクトを選択します。

  2. 対象のディレクトリの右にある統計をクリックします。

    filesize.jpg

方法 2: バケットインベントリを使用した定期的なクエリ

この方法は、定期的なクエリが必要な多数のオブジェクト (最大数百億) を持つディレクトリに推奨されます。

  1. ターゲットバケットの左側のナビゲーションウィンドウで、データ管理 > バケットインベントリ を選択します。

  2. インベントリの作成 をクリックします。インベントリの作成 パネルで、インベントリ保存バケット を選択します。在庫のコンテンツには、Object サイズ を選択します。プレフィックスのマッチングには、ディレクトリ名 (たとえば、random_files/) を入力します。その他のパラメーターはデフォルト設定のままにします。

    screenshot_2025-07-04_18-14-09

  3. インベントリレポートを表示します。

    1. オブジェクト ページで、生成された在庫レポートファイルを <u>/Destination Bucket/inventory-id/</u>data/ パスで見つけます。

    2. インベントリレポートファイルをダウンロードして、ディレクトリのオブジェクト数と合計サイズを表示します。

      インベントリレポートファイルでは、A 列にバケット名、B 列に各オブジェクトの名前、C 列にそのオブジェクトのサイズが表示されます。

      screenshot_2025-07-04_18-28-44

バケットインベントリの詳細については、「バケットインベントリ」をご参照ください。

方法 3: MetaSearch を使用した複雑なクエリの実行

この方法は、特にプレフィックス、時間、またはオブジェクトタイプなどの条件でフィルタリングする必要がある場合に、ディレクトリのほぼリアルタイムのオブジェクト数と合計サイズを取得するのに適しています。

  1. 対象のバケットの左側にあるナビゲーションウィンドウで、オブジェクト管理 > データのインデックス作成 を選択します。

  2. データのインデックス作成 ページで、[今すぐ有効化] をクリックし、スカラー検索 を選択して、有効化 をクリックします。

    説明

    MetaSearch の有効化には、バケット内のオブジェクト数に応じて時間がかかる場合があります。

  3. オブジェクト名 をプレフィックスマッチに設定し、プレフィックスに random_files/ を入力して、その他のパラメーターはデフォルト設定のままにします。

    image

  4. 出力形式を設定します。

    • オブジェクトのソート順デフォルト に設定します。

    • データの集約 では、オブジェクトサイズ合計 で集約します。

      image

  5. 今すぐ検索 をクリックします。結果には、random_files/ ディレクトリのオブジェクトの総数と合計サイズが表示されます。

    image

MetaSearch の詳細については、「MetaSearch」をご参照ください。

本番運用時の注意点

アクセス制御

OSS では、アクセス制御はディレクトリオブジェクト自体ではなく、オブジェクトのプレフィックスマッチングに基づいています。

たとえば、logs/ ディレクトリ内のすべてのオブジェクトに対して、ユーザーに読み取り専用アクセスを付与する場合:

  • : 0 バイトの logs/ プレースホルダーオブジェクトに権限を設定する。

  • 正しい設定: Resource フィールドが acs:oss:*:*:your-bucket-name/logs/* に設定されている RAM ポリシーを作成します。このポリシーは、logs/ プレースホルダーオブジェクトが存在するかどうかに関係なく、logs/ プレフィックスで始まるすべてのオブジェクトに一致します。

パフォーマンスの最適化

  • ディレクトリの深さ: リスト操作のフィルタリングロジックがパフォーマンスを低下させる可能性があるため、a/b/c/d/.../file.log のような深くネストされた構造は避けてください。

  • 大規模な名前変更:多数のオブジェクトを持つディレクトリの名前を変更すると、大量の API 呼び出しが発生し、トラフィックコストが大幅に増加します。システム設計ではこの慣行を避けてください。