Итак, моя проблема в том, что несколько файлов не отображаются в gcsfuse при монтировании. Я вижу их в онлайн-консоли, и если я использую gsutils. Кроме того, если я вручную создаю папку в корзине, я могу видеть файлы внутри нее, но сначала мне нужно создать ее. Какие-либо предложения? gs://mybucket/
dir1/
ok.txt
dir2
lafu.txt
Если я смонтирую mybucket с помощью gcsfuse и сделаю ls, он вернет только dir1 / ok.txt. Затем я создам папку dir2 внутри dir1 в корне точки монтирования, и внезапно появляется «lafu.txt».
Папки не отображаются в хранилище Bucket
Ответы (3)
По умолчанию gcsfuse не отображает каталог, "неявно" определенный файлом с косой чертой в имени. Например, если ваша корзина содержит объект с именем dir/foo.txt
, вы не сможете найти его, если также не будет объекта с именемdir/
.
Вы можете обойти это, установив флаг --implicit-dirs
, но есть веские причины, по которым он не установлен по умолчанию. Дополнительную информацию см. В документации.
--implicit-dirs
). Я не должен тратить час своего времени, пытаясь понять, что происходит.
- person Kyle Baker; 02.04.2018
В Google Cloud Storage нет папок. Различные интерфейсы используют разные уловки, чтобы притвориться, что папки существуют, но в конечном итоге есть только объект, имя которого содержит кучу косых черт. Например, «pictures / january / 0001.jpg» - это полное имя отдельного объекта.
Если вам нужно быть уверенным, что «папка» существует, поместите в нее объект.
@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.
Этот сценарий предполагает, что вы смонтировали корзину GCS локально в системе Linux (или аналогичной). В сценарии сначала указывается корзина GCS и место, где она установлена. Затем он определяет все каталоги в корзине GCS, которые не видны локально, и создает их.
Это (для меня) устранило проблему с папками (и связанными объектами), не отображаемыми в структуре подключенных папок.