Google cloud storage 文件夹未显示在Bucket存储中

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

所以我的问题是,在挂载时,有一些文件没有显示在gcsfuse中。我在联机控制台中看到它们,如果我使用gsutils“ls”。 另外,如果我在bucket中手动创建文件夹,那么我可以看到其中的文件,但我需要先创建它。有什么建议吗?

gs://mybucket/
dir1/
ok.txt
dir2
lafu.txt


如果我使用gcsfuse挂载mybucket并执行'ls',它只返回dir1/ok.txt。
然后,我将在安装点的根目录下的dir1中创建文件夹dir2,突然“lafu.txt”出现。

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


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

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


您可以通过设置
--implicit dirs
标志来解决这个问题,但是有很好的理由说明这不是默认设置。有关更多信息,请参阅。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"
我写了这个脚本,并在上分享了它

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


这(对我来说)解决了文件夹(和相关对象)未显示在已装入文件夹结构中的问题。

感谢您的澄清,已经有所帮助。我想我当时没有解释清楚,我会修改这个问题。非常感谢!!这就是我一直在寻找的。延迟不是什么大问题,所以这解决了一切:)完成:)我不知道这是一件事。(我的第一个堆栈溢出问题)我感谢文档链接的解释,但这仍然是一个有问题的UI。也许检测到“不可见”目录会导致指向相应文档的通知(或建议使用
--implicit dirs
标志)是合适的。我不应该浪费一个小时的时间去弄清楚到底发生了什么。我把这篇文章放在“如果没有堆栈溢出,我将永远无法解决的问题”下面。)多么奇怪的行为。果然,在我手工重新创建了三层父目录之后,最后一层就有了我的文件。糟糕的形式,谷歌/如果你是链接到你自己的脚本,那么请在你的答案中添加一个适当的从属关系。否则,它将被视为垃圾邮件,因为指向GitHub repo的链接不能解决堆栈溢出问题。答案必须实际回答问题,而不要求用户点击其他网站获得答案。请重要链接中最相关的部分,以防目标站点无法访问或永久脱机。考虑到仅仅是一个指向外部站点的链接是这样做的一个原因。谢谢你添加了从属关系。然而,要想得到真正的答案(你的剧本),你还必须离开现场。这可能是合理的,如果所需的代码超出了答案的容量(那么答案中只需要主要部分),但在这种情况下,脚本适合答案。如果我有类似的东西,我会在答案中包含代码,并在GitHub上提供一个链接,也许会提到GitHub版本将是最新的。事实上,这仍然只是宣布您的脚本存在,而不是实际的答案。