code: protected void updateTimestampsForParentDirectories(
        List<URI> modifiedObjects, List<URI> excludedParents) throws IOException {
      logger.atFine().log(
          "updateTimestampsForParentDirectories(%s, %s)", modifiedObjects, excludedParents);
  
      TimestampUpdatePredicate updatePredicate =
          options.getShouldIncludeInTimestampUpdatesPredicate();
      Set<URI> excludedParentPathsSet = new HashSet<>(excludedParents);
  
      Set<URI> parentUrisToUpdate = Sets.newHashSetWithExpectedSize(modifiedObjects.size());
      for (URI modifiedObjectUri : modifiedObjects) {
        URI parentPathUri = getParentPath(modifiedObjectUri);
        if (!excludedParentPathsSet.contains(parentPathUri)
            && updatePredicate.shouldUpdateTimestamp(parentPathUri)) {
          parentUrisToUpdate.add(parentPathUri);
        }
      }
  
      Map<String, byte[]> modificationAttributes = new HashMap<>();
      FileInfo.addModificationTimeToAttributes(modificationAttributes, Clock.SYSTEM);
  
      List<UpdatableItemInfo> itemUpdates = new ArrayList<>(parentUrisToUpdate.size());
  
      for (URI parentUri : parentUrisToUpdate) {
        StorageResourceId resourceId = pathCodec.validatePathAndGetId(parentUri, true);
        if (!resourceId.isBucket() && !resourceId.isRoot()) {
          itemUpdates.add(new UpdatableItemInfo(resourceId, modificationAttributes));
        }
      }
  
      if (!itemUpdates.isEmpty()) {
        gcs.updateItems(itemUpdates);
      } else {
        logger.atFine().log("All paths were excluded from directory timestamp updating.");
      }
    }
docs: For each listed modified object, attempt to update the modification time
  of the parent directory.
  @param modifiedObjects The objects that have been modified
  @param excludedParents A list of parent directories that we shouldn't attempt to update.