**Describe the situation**

The author implemented it but enabled only for DiskS3.
CC @excitoon 
fs::path directory_path(path);
            auto directory_name = directory_path.parent_path().filename().string();
            auto predicate = [&directory_name](String & prefix) { return directory_name.starts_with(prefix); };
            if (std::any_of(not_finished_prefixes.begin(), not_finished_prefixes.end(), predicate))
                continue;
            auto detached_path = pathToDetached(path);
            LOG_TRACE(log, "Move directory to 'detached' {} -> {}", path, detached_path);
            fs::path from_path = fs::path(path);
            fs::path to_path = fs::path(detached_path);
            if (path.ends_with('/'))
                to_path /= from_path.parent_path().filename();
            else
                to_path /= from_path.filename();
            
            if (metadata_disk->exists(to_path))
                metadata_disk->removeRecursive(to_path);
            createDirectories(directoryPath(to_path));
            metadata_disk->moveDirectory(from_path, to_path);
        }
    }
    LOG_INFO(log, "File operations restored for disk {}", name);
}
std::tuple<UInt64, String> DiskS3::extractRevisionAndOperationFromKey(const String & key)
{
    String revision_str;
    String operation;
    re2::RE2::FullMatch(key, key_regexp, &revision_str, &operation);
    return {(revision_str.empty() ? UNKNOWN_REVISION : static_cast<UInt64>(std::bitset<64>(revision_str).to_ullong())), operation};
}
String DiskS3::shrinkKey(const String & path, const String & key)