文件夹未显示在存储桶存储中
Folders not showing up in Bucket storage
所以我的问题是有一些文件在挂载时没有显示在 gcsfuse 中。我在在线控制台中看到它们,如果我 'ls' 使用 gsutils。
另外,如果我在存储桶中手动创建文件夹,我可以看到其中的文件,但我需要先创建它。有什么建议么?
gs://mybucket/
dir1/
ok.txt
dir2
lafu.txt
如果我用 gcsfuse 安装 mybucket 并执行 'ls' 它只会 returns dir1/ok.txt。
然后我将在挂载点的根目录的 dir1 中创建文件夹 dir2,然后突然 'lafu.txt' 出现。
Google 云存储没有文件夹。各种界面使用不同的技巧来假装文件夹存在,但最终只有一个名称包含一堆斜杠的对象。例如,"pictures/january/0001.jpg"是单个对象的全名。
如果您需要确定 "folder" 存在,请在其中放置一个对象。
默认情况下,gcsfuse 不会显示由名称中带有斜杠的文件定义的目录 "implicitly"。例如,如果您的存储桶包含一个名为 dir/foo.txt
的对象,您将无法找到它,除非还有一个名为 dir/
.
的对象
您可以通过设置 --implicit-dirs
标志来解决此问题,但有充分的理由说明为什么这不是默认设置。有关详细信息,请参阅 documentation。
@Brandon Yarbrough 建议在 GCS 存储桶中创建所需的目录条目。这避免了@jacobsa 描述的性能损失。
这里有一个 bash
脚本:
# 1. Mount $BUCKET_NAME at $MOUNT_PT
# 2. Run this script
MOUNT_PT=${1:-HOME/mnt}
BUCKET_NAME=
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 存储桶中在本地不可见的所有“目录”,并创建它们。
这(对我而言)解决了文件夹(和关联对象)未显示在安装的文件夹结构中的问题。
所以我的问题是有一些文件在挂载时没有显示在 gcsfuse 中。我在在线控制台中看到它们,如果我 'ls' 使用 gsutils。
另外,如果我在存储桶中手动创建文件夹,我可以看到其中的文件,但我需要先创建它。有什么建议么?
gs://mybucket/
dir1/
ok.txt
dir2
lafu.txt
如果我用 gcsfuse 安装 mybucket 并执行 'ls' 它只会 returns dir1/ok.txt。
然后我将在挂载点的根目录的 dir1 中创建文件夹 dir2,然后突然 'lafu.txt' 出现。
Google 云存储没有文件夹。各种界面使用不同的技巧来假装文件夹存在,但最终只有一个名称包含一堆斜杠的对象。例如,"pictures/january/0001.jpg"是单个对象的全名。
如果您需要确定 "folder" 存在,请在其中放置一个对象。
默认情况下,gcsfuse 不会显示由名称中带有斜杠的文件定义的目录 "implicitly"。例如,如果您的存储桶包含一个名为 dir/foo.txt
的对象,您将无法找到它,除非还有一个名为 dir/
.
您可以通过设置 --implicit-dirs
标志来解决此问题,但有充分的理由说明为什么这不是默认设置。有关详细信息,请参阅 documentation。
@Brandon Yarbrough 建议在 GCS 存储桶中创建所需的目录条目。这避免了@jacobsa 描述的性能损失。
这里有一个 bash
脚本:
# 1. Mount $BUCKET_NAME at $MOUNT_PT
# 2. Run this script
MOUNT_PT=${1:-HOME/mnt}
BUCKET_NAME=
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 存储桶中在本地不可见的所有“目录”,并创建它们。
这(对我而言)解决了文件夹(和关联对象)未显示在安装的文件夹结构中的问题。