文件夹未显示在Bucket存储中

时间:2016-07-11 15:42:09

标签: google-cloud-storage bucket gcsfuse

所以我的问题是在安装时有一些文件没有出现在gcsfuse中。我在在线控制台中看到它们,如果我和gsutils一起。 另外,如果我手动在存储桶中创建文件夹,那么我可以看到其中的文件,但我需要先创建它。有什么建议?

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

如果我用gcsfuse挂载mybucket并执行'ls'它只返回dir1 / ok.t​​xt。 然后我将在安装点根部的dir1内创建文件夹dir2,然后突然出现'lafu.txt'。

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

如果你需要确定一个"文件夹"存在,把一个对象放在里面。

答案 2 :(得分:0)

@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存储桶中在本地不可见的所有“目录”,并创建它们。

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