文件夹未显示在存储桶存储中
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 版本将是最新的。实际上,这仍然只是您的脚本存在的公告,而不是 实际 答案。以上是关于文件夹未显示在存储桶存储中的主要内容,如果未能解决你的问题,请参考以下文章
图像保存的 con Amazon S3 存储桶未显示在 HTML5 画布上。跨域问题