文件夹未显示在存储桶存储中

Posted

技术标签:

【中文标题】文件夹未显示在存储桶存储中【英文标题】:Folders not showing up in Bucket storage 【发布时间】:2016-11-13 15:24:51 【问题描述】:

所以我的问题是安装时有一些文件没有显示在 gcsfuse 中。我在在线控制台中看到它们,如果我用 gsutils 'ls'。 另外,如果我在存储桶中手动创建文件夹,我可以看到其中的文件,但我需要先创建它。有什么建议? gs://mybucket/ dir1/ ok.txt dir2 lafu.txt 如果我用 gcsfuse 挂载 mybucket 并执行“ls”,它只会返回 dir1/ok.txt。 然后我会在挂载点根目录的 dir1 中创建文件夹 dir2,然后突然出现“lafu.txt”。

【问题讨论】:

多么奇怪的行为。果然,我手动重新创建了三层父目录后,最后一层里面有我的文件。糟糕的形式,谷歌。 :// 【参考方案1】:

默认情况下,gcsfuse 不会显示由名称中带有斜杠的文件“隐式”定义的目录。例如,如果您的存储桶包含一个名为 dir/foo.txt 的对象,您将无法找到它,除非还有一个名为 dir/ 的对象。

您可以通过设置--implicit-dirs 标志来解决此问题,但有充分的理由说明这不是默认设置。请参阅documentation 了解更多信息。

【讨论】:

非常感谢!!这就是我一直在寻找的。延迟不是什么大问题,所以这解决了一切:) 完成 :) 我不知道那是一回事。 (我的第一个堆栈溢出问题) 我很欣赏文档链接的解释,但这仍然是一个有问题的 UI。也许检测“不可见”“目录”会导致指向适当文档的通知(或--implicit-dirs 标志的建议)是合适的。我不应该浪费一个小时来弄清楚发生了什么。 我将此文件归档在“如果没有 Stack Overflow,我将永远无法解决的问题”;)【参考方案2】:

Google Cloud Storage 没有文件夹。各种接口使用不同的技巧来假装文件夹存在,但最终只有一个名称包含一堆斜杠的对象。例如,“pictures/january/0001.jpg”是单个对象的全名。

如果您需要确定“文件夹”是否存在,请在其中放置一个对象。

【讨论】:

感谢您的澄清,已经有所帮助。我想我当时没有很好地解释自己,我会修改问题。【参考方案3】:

@Brandon Yarbrough 建议在 GCS 存储桶中创建所需的目录条目。这避免了@jacobsa 描述的性能损失。

这是一个 bash 脚本用于执行此操作:

# 1.  Mount $BUCKET_NAME at $MOUNT_PT
# 2.  Run this script
MOUNT_PT=$1:-HOME/mnt
BUCKET_NAME=$2
DEL_OUTFILE=$3:-y    # Set to y or n

echo "Reading objects in $BUCKET_NAME"
OUTFILE=dir_names.txt
gsutil ls -r gs://$BUCKET_NAME/** | while read BUCKET_OBJ
do   
    dirname "$BUCKET_OBJ"
done | sort -u > $OUTFILE
echo "Processing directories found"
cat $OUTFILE | while read DIR_NAME
do
    LOCAL_DIR=`echo "$DIR_NAME" | sed "s=gs://$BUCKET_NAME/==" | sed "s=gs://$BUCKET_NAME=="`
    #echo $LOCAL_DIR
    TARG_DIR="$MOUNT_PT/$LOCAL_DIR"
    if ! [ -d "$TARG_DIR" ]
    then
        echo "Creating $TARG_DIR"
        mkdir -p "$TARG_DIR"
    fi
done
if [ $DEL_OUTFILE = "y" ]
then
    rm $OUTFILE
fi
echo "Process complete"

我编写了这个脚本,并在https://github.com/mherzog01/util/blob/main/sh/mk_bucket_dirs.sh 分享了它。

此脚本假定您已在 Linux(或类似)系统上本地安装了 GCS 存储桶。该脚本首先指定 GCS 存储桶和存储桶的安装位置。然后,它会识别 GCS 存储桶中本地不可见的所有“目录”,并创建它们。

这(对我而言)解决了文件夹(和关联对象)未显示在已安装文件夹结构中的问题。

【讨论】:

如果您要链接到自己的脚本,请在您的答案中添加适当的从属关系。否则,将被视为垃圾邮件 只是一个指向您的 GitHub 存储库的链接并不能成为 Stack Overflow 上的答案。答案必须实际回答问题,而不要求用户点击其他站点来获得答案。请add context around links。 Always quote 重要链接中最相关的部分,以防目标站点无法访问或永久离线。 考虑到它仅仅是指向外部站点的链接 i> 是Why and how are some answers deleted? 的原因。 感谢您添加从属关系。但是,要获得真正的 答案(您的脚本),仍然需要离开现场。这可能是合理的,如果所需的代码超出了答案的容量(那么答案中只需要主要部分),但在这种情况下,脚本适合答案。在我有类似情况的情况下,我已经在答案中包含了代码并在 GitHub 上提供了指向它的链接,也许提到 GitHub 版本将是最新的。实际上,这仍然只是您的脚本存在的公告,而不是 实际 答案。

以上是关于文件夹未显示在存储桶存储中的主要内容,如果未能解决你的问题,请参考以下文章

S3 存储桶上的未加密文件是不是有 Etag?

图像未从 Amazon S3 存储桶加载

图像保存的 con Amazon S3 存储桶未显示在 HTML5 画布上。跨域问题

从云存储桶加载数据时未找到数据集错误

存储桶文件更改后,如何清除静态 Cloud Storage 网站上的缓存?

将 ownCloud/Nextcloud 与 S3 存储桶同步问题一起使用