Compartilhar via


Inventário de blob de Armazenamento do Azure

O inventário de blobs de Armazenamento do Microsoft Azure fornece uma lista dos contêineres, blobs, versões de blob e instantâneos em sua conta de armazenamento, junto com suas propriedades associadas. Ele gera um relatório de saída no formato de valores separados por vírgula (CSV) ou Apache Parquet diariamente ou semanalmente. Você pode usar o relatório para auditar o status da retenção, retenção legal ou criptografia do conteúdo da sua conta de armazenamento, ou pode usá-lo para entender o tamanho total dos dados, a idade, a distribuição por níveis ou outros atributos dos seus dados. Você também pode usar o inventário de BLOBs para simplificar os fluxos de trabalho da sua empresa ou acelerar os trabalhos de processamento de dados, usando o inventário de BLOBs como uma automação programada das APIs Listas de Contêineres e Listas de Blobs. As regras de inventário de blobs permitem que você filtre o conteúdo do relatório por tipo, prefixo ou selecionando as propriedades do blob a serem incluídas no relatório.

O inventário do blob do Armazenamento do Azure está disponível para os seguintes tipos de contas de armazenamento:

  • Uso geral v2 Standard
  • Armazenamento de blob de blocos Premium
  • Armazenamento de blob

Recursos de inventário

A lista a seguir descreve recursos e funcionalidades que estão disponíveis na versão atual do inventário de blobs do Armazenamento do Azure.

  • Relatórios de inventário para blobs e contêineres

    É possível gerar relatórios de inventário para blobs e contêineres. Um relatório de blobs pode conter blobs de base, instantâneos, tamanho do conteúdo, versões de blob e propriedades associadas, como hora de criação e hora da última modificação. Os contêineres vazios não estão listados no relatório de inventário do blob. Um relatório de contêineres descreve contêineres e propriedades associadas, como status de política de imutabilidade e status de retenção legal.

  • Esquema personalizado

    É possível escolher quais campos aparecem nos relatórios. Escolha em uma lista os campos com suporte. Essa lista aparece posteriormente neste artigo.

  • Formatos de saída CSV e Apache Parquet

    É possível gerar um relatório de inventário em formato de saída CSV ou Apache Parquet.

  • Arquivo de manifesto e evento da Grade de Eventos do Azure por relatório de inventário

    Um arquivo de manifesto e um evento da Grade de Eventos do Azure são gerados a cada relatório de inventário. As opções são descritas posteriormente neste artigo.

Como habilitar os relatórios de inventário

Habilite os relatórios de inventário de blobs adicionando uma política com uma ou mais regras à sua conta de armazenamento. Para obter orientações, veja Habilitar relatórios de inventário de blobs do Armazenamento do Azure.

Atualizando uma política de inventário

Se você já é um usuário do inventário de blobs do Armazenamento do Azure que configurou o inventário antes de junho de 2021, comece a usar os novos recursos carregando a política, fazendo alterações e salvando-a em seguida. Ao recarregar a política, os novos campos nela serão preenchidos com os valores padrão. É possível alterar esses valores, caso desejado. Além disso, os dois recursos a seguir estarão disponíveis.

  • Um contêiner de destino agora é compatível com todas as regras em vez de somente com a política.

  • Um arquivo de manifesto e um evento da Grade de Eventos do Azure agora são gerados por regra em vez de por política.

Política de inventário

Um relatório de inventário é configurado por meio da adição de uma política de inventário com uma ou mais regras. Uma política de inventário é uma coleção de regras em um documento JSON.

{
  "enabled": true,
  "rules": [
  {
    "enabled": true,
    "name": "inventoryrule1",
    "destination": "inventory-destination-container",
    "definition": {. . .}
  },
  {
    "enabled": true,
    "name": "inventoryrule2",
    "destination": "inventory-destination-container",
    "definition": {. . .}
  }]
}

Veja o JSON para uma política de inventário selecionando a guia Exibição de código na seção Inventário de blobs do portal do Azure.

Nome do parâmetro Tipo de parâmetro Observações Necessário?
Habilitado booleano Usado para desabilitar toda a política. Quando definido como true, o campo com o nível de regra habilitado substitui esse parâmetro. Quando desabilitado, o inventário de todas as regras será desabilitado. Yes
regras Matriz de objetos de regra Pelo menos uma regra é necessária em uma política. Cada política fornece suporte a até 100 regras. Yes

Regras de inventário

Uma regra captura as condições de filtragem e os parâmetros de saída necessários para gerar um relatório de inventário. Cada regra cria um relatório de inventário. As regras podem ter prefixos sobrepostos. Um blob pode aparecer em mais de um inventário, dependendo das definições de regra.

Cada regra na política tem vários parâmetros:

Nome do parâmetro Tipo de parâmetro Observações Necessário?
name string Um nome de regra pode incluir até 256 caracteres alfanuméricos que diferenciam maiúsculas de minúsculas. O nome precisa ser exclusivo em uma política. Yes
Habilitado booleano Um sinalizador que permite que uma regra seja habilitada ou desabilitada. O valor padrão é true. Yes
definição Definição de regra de inventário JSON Cada definição é composta por um conjunto de filtros de regras. Yes
destino string O contêiner de destino em que todos os arquivos de inventário são gerados. O contêiner de destino já precisa existir.

O sinalizador Habilitado para inventário de blobs global tem precedência sobre o parâmetro enabled em uma regra.

Definição de regra

Nome do parâmetro Tipo de parâmetro Observações Obrigatório
filtros json Os filtros decidem se um blob ou contêiner faz parte do inventário. Sim
format string Determina a saída do arquivo de inventário. Os valores válidos são csv (para o formato CSV) e parquet (para o formato Apache Parquet). Sim
objectType string Indica se essa é uma regra de inventário para blobs ou contêineres. Os valores válidos são blob e container. Sim
schedule string Agendamento da execução dessa regra. Os valores válidos são daily e weekly. Sim
schemaFields Matriz JSON Lista de campos de esquema para fazer parte do inventário. Sim

Filtros de regra

Vários filtros estão disponíveis para personalizar um relatório de inventário de blobs:

Nome do filtro Tipo de filtro Observações Necessário?
blobTypes Matriz de valores de enumeração predefinidos Os valores válidos são blockBlob e appendBlob para contas habilitadas para namespace hierárquico e blockBlob, appendBlob e pageBlob para outras contas. Esse campo não é aplicável ao inventário em um contêiner, (objectType: container). Sim
creationTime Número Especifica o número de dias passados no qual o blob deve ter sido criado. Por exemplo, um valor de 3 inclui no relatório somente os blobs que foram criados nos últimos três dias. Não
prefixMatch Uma matriz de até dez cadeias de caracteres para que os prefixos sejam correspondidos. Se você não definir prefixMatch ou fornecer um prefixo vazio, a regra se aplicará a todos os blobs na conta de armazenamento. Um prefixo deve ser um prefixo de nome de contêiner ou um nome de contêiner. Por exemplo, container, container1/foo. Não
excludePrefix Matriz de até dez cadeias de caracteres para prefixos a serem excluídos. Especifica os caminhos de blob a serem excluídos do relatório de inventário.

Um prefixo excludePrefix deve ser um prefixo de nome de contêiner ou um nome de contêiner. Um excludePrefix vazio significaria que todos os blobs com nomes correspondentes a qualquer cadeia de caracteres prefixMatch serão listados.

Para incluir um determinado prefixo, mas excluir algum subconjunto específico dele, use o filtro excludePrefix. Por exemplo, para incluir todos os blobs em container-a, exceto os da pasta container-a/folder, prefixoMatch deve ser definido como container-a e excludePrefix deve ser definido como container-a/folder.
Não
includeSnapshots booleano Especifica se o inventário deve incluir instantâneos. O padrão é false. Esse campo não é aplicável ao inventário em um contêiner, (objectType: container). Não
includeBlobVersions booleano Especifica se o inventário deve incluir versões de blob. O padrão é false. Esse campo não é aplicável ao inventário em um contêiner, (objectType: container). Não
includeDeleted booleano Especifica se o inventário deve incluir blobs excluídos. O padrão é false. Nas contas que têm um namespace hierárquico, esse filtro inclui pastas, assim como blobs que estão em um estado de exclusão temporária.

Somente as pastas e arquivos (blobs) que foram excluídos explicitamente aparecem em relatórios. Os arquivos e pastas filho que são excluídos como resultado da exclusão de uma pasta pai não são incluídos no relatório.
Não

Veja o JSON para regras de inventário selecionando a guia Exibição de código na seção Inventário de blobs do portal do Azure. Os filtros são especificados em uma definição de regra.

{
  "destination": "inventory-destination-container",
  "enabled": true,
  "rules": [
  {
    "definition": {
      "filters": {
        "blobTypes": ["blockBlob", "appendBlob", "pageBlob"],
        "prefixMatch": ["inventorytestcontainer1", "inventorytestcontainer2/abcd", "etc"],
        "excludePrefix": ["inventorytestcontainer10", "etc/logs"],
        "includeSnapshots": false,
        "includeBlobVersions": true,
      },
      "format": "csv",
      "objectType": "blob",
      "schedule": "daily",
      "schemaFields": ["Name", "Creation-Time"]
    },
    "enabled": true,
    "name": "blobinventorytest",
    "destination": "inventorydestinationContainer"
  },
  {
    "definition": {
      "filters": {
        "prefixMatch": ["inventorytestcontainer1", "inventorytestcontainer2/abcd", "etc"]
      },
      "format": "csv",
      "objectType": "container",
      "schedule": "weekly",
      "schemaFields": ["Name", "HasImmutabilityPolicy", "HasLegalHold"]
    },
    "enabled": true,
    "name": "containerinventorytest",
    "destination": "inventorydestinationContainer"
    }
  ]
}

Campos de esquema personalizados com suporte para o inventário de blobs

Observação

A coluna Data Lake Storage mostra o suporte em contas que têm o recurso de namespace hierárquico habilitado.

Campo Armazenamento de Blobs (suporte padrão) Data Lake Storage
Nome (obrigatório) Sim Sim
Creation-Time Sim Sim
Last-Modified Sim Sim
LastAccessTime1 Sim Sim
ETag Sim Sim
Content-Length Sim Sim
Tipo de conteúdo Sim Sim
Codificação de conteúdo Sim Sim
Content-Language Sim Sim
Content-CRC64 Sim Sim
Content-MD5 Sim Sim
Cache-Control Sim Sim
Cache-Disposition Sim Sim
BlobType Sim Sim
AccessTier Sim Sim
AccessTierChangeTime Sim Sim
LeaseStatus Sim Sim
LeaseState Sim Sim
ServerEncrypted Sim Sim
CustomerProvidedKeySHA256 Sim Sim
Metadados Sim Sim
Expiry-Time No Sim
hdi_isfolder No Sim
Proprietário No Sim
Grupo No Sim
Permissões No Sim
ACL No Sim
Snapshot (disponível e necessário para incluir instantâneos em seu relatório) Sim Sim
Excluído Sim Sim
DeletedId No Sim
DeletedTime No Sim
RemainingRetentionDays Sim Sim
VersionId (disponível e necessário para incluir versões de blob em seu relatório) Sim No
IsCurrentVersion (disponível e necessário para incluir versões de blob em seu relatório) Sim No
TagCount Sim Não
Marcações Sim No
CopyId Sim Sim
CopySource Sim Sim
CopyStatus Sim Sim
CopyProgress Sim Sim
CopyCompletionTime Sim Sim
CopyStatusDescription Sim Sim
ImmutabilityPolicyUntilDate Sim Sim
ImmutabilityPolicyMode Sim Sim
LegalHold Sim Sim
RehydratePriority Sim Sim
ArchiveStatus Sim Sim
EncryptionScope Sim Sim
IncrementalCopy Sim Sim
x-ms-blob-sequence-number Sim Não

1 Desabilitado por padrão. Habilitar opcionalmente o rastreamento de tempo de acesso.

Campos de esquema personalizados com suporte para inventário de contêiner

Observação

A coluna Data Lake Storage mostra o suporte em contas que têm o recurso de namespace hierárquico habilitado.

Campo Armazenamento de Blobs (suporte padrão) Data Lake Storage
Nome (obrigatório) Sim Sim
Last-Modified Sim Sim
ETag Sim Sim
LeaseStatus Sim Sim
LeaseState Sim Sim
LeaseDuration Sim Sim
Metadados Sim Sim
PublicAccess Sim Sim
DefaultEncryptionScope Sim Sim
DenyEncryptionScopeOverride Sim Sim
HasImmutabilityPolicy Sim Sim
HasLegalHold Sim Sim
ImmutableStorageWithVersioningEnabled Sim Yes
Excluído (é exibido somente se “Incluir contêineres excluídos” estiver selecionado) Sim Yes
Versão (é exibido somente se “Incluir contêineres excluídos” estiver selecionado) Sim Sim
DeletedTime (será exibido somente se “Incluir contêineres excluídos” estiver selecionado) Sim Sim
RemainingRetentionDays (será exibido somente se “Incluir contêineres excluídos” estiver selecionado) Sim Sim

Execução de inventário

Se você configurar uma regra para ser executada diariamente, ela será agendada para ser executada todos os dias. Se você configurar uma regra para ser executada semanalmente, ela será agendada para ser executada toda semana no domingo no horário UTC.

A maioria das execuções de inventário é concluída dentro de 24 horas. Para contas habilitadas para namespace hierárquico, uma execução pode levar até dois dias e, dependendo do número de arquivos que estão sendo processados, ela pode não ser concluída ao final dos dois dias. A quantidade máxima de tempo que uma execução pode ser concluída antes de falhar é de seis dias.

As execuções não se sobrepõem, portanto, uma execução deve ser concluída antes que outra execução da mesma regra possa começar. Por exemplo, se uma regra for agendada para ser executada diariamente, mas a execução do dia anterior dessa mesma regra ainda estiver em andamento, a nova execução não será iniciada nesse dia. As regras agendadas para serem executadas semanalmente serão executadas todos os domingos, independentemente de uma execução anterior ter êxito ou falhar. Se uma execução não for concluída com sucesso, verifique as execuções seguintes para ver se elas foram concluídas antes de entrar em contato com o suporte. O desempenho de uma execução pode variar, portanto, se uma execução não for concluída, será possível que as execuções subsequentes sejam executadas.

As políticas de inventário são lidas ou gravadas integralmente. Não há suporte para atualizações parciais. As regras de inventário são avaliadas diariamente. Portanto, se você alterar a definição de uma regra, mas as regras de uma política já tiverem sido avaliadas para esse dia, suas atualizações não serão avaliadas até o dia seguinte.

Evento de conclusão de inventário

O evento BlobInventoryPolicyCompleted é gerado quando a execução de inventário é concluída para uma regra. Este evento também ocorre se a execução do inventário falha com um erro de usuário antes de começar. Por exemplo, uma política inválida ou um erro ocorrido quando um contêiner de destino não está presente vai disparar o evento. O seguinte JSON mostra um exemplo de evento BlobInventoryPolicyCompleted.

{
  "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/BlobInventory/providers/Microsoft.EventGrid/topics/BlobInventoryTopic",
  "subject": "BlobDataManagement/BlobInventory",
  "eventType": "Microsoft.Storage.BlobInventoryPolicyCompleted",
  "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "data": {
    "scheduleDateTime": "2021-05-28T03:50:27Z",
    "accountName": "testaccount",
    "ruleName": "Rule_1",
    "policyRunStatus": "Succeeded",
    "policyRunStatusMessage": "Inventory run succeeded, refer manifest file for inventory details.",
    "policyRunId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "manifestBlobUrl": "https://testaccount.blob.core.windows.net/inventory-destination-container/2021/05/26/13-25-36/Rule_1/Rule_1-manifest.json"
  },
  "dataVersion": "1.0",
  "metadataVersion": "1",
  "eventTime": "2021-05-28T15:03:18Z"
}

A tabela a seguir descreve o esquema do evento BlobInventoryPolicyCompleted.

Campo Type Descrição
scheduleDateTime string A hora em que a regra de inventário foi agendada.
accountName string O nome da conta de armazenamento.
ruleName string O nome da regra.
policyRunStatus string O status da execução de inventário. Os valores possíveis são Succeeded, PartiallySucceeded e Failed.
policyRunStatusMessage string A mensagem de status para a execução de inventário.
policyRunId string A ID de execução de política para a execução de inventário.
manifestBlobUrl string A URL de blob do arquivo de manifesto para a execução de inventário.

Saída de inventário

Cada regra de inventário gera um conjunto de arquivos no contêiner de destino de inventário especificado para essa regra. A saída de inventário é gerada no seguinte caminho: https://<accountName>.blob.core.windows.net/<inventory-destination-container>/YYYY/MM/DD/HH-MM-SS/<ruleName, em que:

  • accountName é o nome da sua conta de Armazenamento de Blobs do Azure
  • inventory-destination-container é o contêiner de destino especificado na regra de inventário
  • YYYY/MM/DD/HH-MM-SS é a hora em que o inventário começou a ser executado
  • ruleName é o nome da regra de inventário.

Arquivos de inventário

Cada execução de inventário gera os seguintes arquivos:

  • Arquivo de inventário: uma execução de inventário para uma regra gera diversos arquivos nos formatos CSV ou Apache Parquet. Cada arquivo contém objetos correspondentes e os respectivos metadados.

    Importante

    A partir de outubro de 2023, as execuções de inventário produzirão vários arquivos se a contagem de objetos for grande. Para saber mais, confira Perguntas Frequentes sobre produção de diversos arquivos de inventário.

    Os relatórios no formato Apache Parquet apresentam datas no seguinte formato: timestamp_millis [number of milliseconds since 1970-01-01 00:00:00 UTC]. Para um arquivo formatado em CSV, a primeira linha é sempre a linha de esquema. A imagem a seguir mostra um arquivo CSV de inventário aberto no Microsoft Excel.

    Captura de tela de um arquivo CSV de inventário aberto no Microsoft Excel

    Importante

    Os caminhos de blob que aparecem em um arquivo de inventário podem não aparecer em nenhuma ordem específica.

  • Arquivo de soma de verificação: um arquivo de soma de verificação contém a soma de verificação MD5 do conteúdo do arquivo manifest.json. O nome do arquivo de soma de verificação é <ruleName>-manifest.checksum. A geração do arquivo de soma de verificação marca a conclusão de uma execução de regra de inventário.

  • Arquivo de manifesto: um arquivo manifest.json contém os detalhes dos arquivos de inventário gerados para essa regra. O nome do arquivo é <ruleName>-manifest.json. Este arquivo também captura a definição de regra fornecida pelo usuário e o caminho para o inventário dessa regra. O JSON a seguir mostra o conteúdo de um arquivo manifest.json de amostra.

    {
    "destinationContainer" : "inventory-destination-container",
    "endpoint" : "https://testaccount.blob.core.windows.net",
    "files" : [
      {
        "blob" : "2021/05/26/13-25-36/Rule_1/Rule_1.csv",
        "size" : 12710092
      }
    ],
    "inventoryCompletionTime" : "2021-05-26T13:35:56Z",
    "inventoryStartTime" : "2021-05-26T13:25:36Z",
    "ruleDefinition" : {
      "filters" : {
        "blobTypes" : [ "blockBlob" ],
        "includeBlobVersions" : false,
        "includeSnapshots" : false,
        "prefixMatch" : [ "penner-test-container-100003" ]
      },
      "format" : "csv",
      "objectType" : "blob",
      "schedule" : "daily",
      "schemaFields" : [
        "Name",
        "Creation-Time",
        "BlobType",
        "Content-Length",
        "LastAccessTime",
        "Last-Modified",
        "Metadata",
        "AccessTier"
      ]
    },
    "ruleName" : "Rule_1",
    "status" : "Succeeded",
    "summary" : {
      "objectCount" : 110000,
      "totalObjectSize" : 23789775
    },
    "version" : "1.0"
    }
    

    Esse arquivo é criado quando a execução é iniciada. O campo status desse arquivo é definido como Pending até que a execução seja concluída. Após a conclusão da execução, esse campo é definido com um status de conclusão (por exemplo: Succeeded ou Failed).

Preços e cobrança

O preço do inventário é baseado no número de blobs e contêineres que são verificados durante o período de faturamento. A página de preços do Armazenamento de Blobs do Azure mostra o preço por um milhão de objetos verificados. Por exemplo, se o preço para examinar um milhão de objetos for $0.003, sua conta contiver três milhões de objetos e você produzir quatro relatórios em um mês, sua fatura será de 4 * 3 * $0.003 = $0.036.

Depois que os arquivos de inventário são criados, encargos adicionais de operações e armazenamentos de dados padrão serão incorridos para armazenar, ler e gravar os arquivos gerados pelo inventário na conta.

Se uma regra contém um prefixo que se sobrepõe a um prefixo de qualquer outra, o mesmo blob pode aparecer em mais de um relatório de inventário. Nesse caso, você é cobrado por ambas as instâncias. Por exemplo, suponha que o elemento prefixMatch de uma regra seja definido como ["inventory-blob-1", "inventory-blob-2"] e o elemento prefixMatch de outra regra seja definido como ["inventory-blob-10", "inventory-blob-20"]. Um objeto nomeado inventory-blob-200 aparece em ambos os relatórios de inventário.

Instantâneos e versões de um blob também contam para o faturamento, mesmo que você tenha definido os filtros includeSnapshots e includeVersions para false. Esses valores de filtro não afetam a cobrança. É possível usá-los somente para filtrar o que aparece no relatório.

Para saber mais sobre os preços do inventário de blobs de Armazenamento do Azure, veja Preços do Armazenamento de Blobs do Azure.

Suporte a recursos

O suporte para esse recurso pode ser afetado ao habilitar o Data Lake Storage Gen2, o protocolo NFS (Sistema de Arquivos de Rede) 3.0 ou o protocolo SFTP (Protocolo de Transferência de Arquivo SSH). Se você tiver habilitado qualquer um desses recursos, consulte o Suporte a recursos de Armazenamento de Blobs nas contas de Armazenamento do Azure para avaliar o suporte para esse recurso.

Limitações e problemas conhecidos

Esta seção descreve as limitações e problemas conhecidos do recurso de inventário de blobs do Armazenamento do Azure.

Os trabalhos de inventário levam mais tempo para serem concluídos em determinados casos

Um trabalho de inventário pode levar mais tempo nesses casos:

  • Uma grande quantidade de novos dados é adicionada

  • Uma regra ou um conjunto de regras está sendo executado pela primeira vez

    A execução do inventário pode levar mais tempo para ser executada em comparação com as execuções de inventário subsequentes.

  • Uma execução do inventário está processando uma grande quantidade de dados em contas habilitadas para namespace hierárquico

    Um trabalho de inventário pode levar mais de um dia para ser concluído nas contas habilitadas para namespace hierárquico que têm centenas de milhões de blobs. Às vezes, o trabalho de inventário falha e não cria um arquivo de inventário. Se um trabalho não for concluído com sucesso, verifique os trabalhos seguintes para ver se eles foram concluídos antes de entrar em contato com o suporte.

  • Não há opção para gerar um relatório retrospectivamente para uma data específica.

Os trabalhos de inventário não podem gravar relatórios em contêineres que têm uma política de replicação de objeto

Uma política de replicação de objeto pode impedir que um trabalho de inventário grave relatórios de inventário no contêiner de destino. Alguns outros cenários podem arquivar os relatórios ou tornar os relatórios imutáveis quando eles são parcialmente concluídos, o que pode causar uma falha nos trabalhos de inventário.

Inventário e armazenamento imutável

Você não poderá configurar uma política de inventário na conta se o suporte para imutabilidade no nível de versão estiver habilitado nessa conta ou se o suporte para imutabilidade no nível de versão estiver habilitado no contêiner de destino definido na política de inventário.

Os relatórios podem excluir os blobs excluídos de modo reversível em contas com um namespace hierárquico

Se um contêiner ou diretório for excluído com a exclusão reversível habilitada, o contêiner ou diretório e todo o conteúdo dele serão marcados como excluídos de modo reversível. No entanto, apenas o contêiner ou diretório (relatado como um blob de comprimento zero) aparece em um relatório de inventário e não os blobs eliminados de modo reversível nesse contêiner ou diretório, mesmo que o campo includeDeleted da política seja definido como verdadeiro. Isso pode resultar em uma diferença entre o que aparece nas métricas de capacidade obtidas no portal do Azure e o que é relatado por um relatório de inventário.

Somente os blobs excluídos explicitamente aparecem nos relatórios. Portanto, para que seja possível obter uma listagem completa de todos os blobs excluídos de modo reversível (diretório e todos os blobs filhos), as cargas de trabalho devem excluir cada blob em um diretório antes de excluir o próprio diretório.

Próximas etapas