Папки не отображаются в хранилище Bucket

Итак, моя проблема в том, что несколько файлов не отображаются в gcsfuse при монтировании. Я вижу их в онлайн-консоли, и если я использую gsutils. Кроме того, если я вручную создаю папку в корзине, я могу видеть файлы внутри нее, но сначала мне нужно создать ее. Какие-либо предложения?

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

Если я смонтирую mybucket с помощью gcsfuse и сделаю ls, он вернет только dir1 / ok.txt. Затем я создам папку dir2 внутри dir1 в корне точки монтирования, и внезапно появляется «lafu.txt».


person cupcakearmy    schedule 11.07.2016    source источник
comment
Какое невероятно странное поведение. Конечно же, после того, как я вручную воссоздал три уровня родительских каталогов, на последнем слое был мой файл внутри. Плохая форма, Google. : /   -  person Kyle Baker    schedule 02.04.2018


Ответы (3)


По умолчанию gcsfuse не отображает каталог, "неявно" определенный файлом с косой чертой в имени. Например, если ваша корзина содержит объект с именем dir/foo.txt, вы не сможете найти его, если также не будет объекта с именемdir/.

Вы можете обойти это, установив флаг --implicit-dirs, но есть веские причины, по которым он не установлен по умолчанию. Дополнительную информацию см. В документации.

person jacobsa    schedule 12.07.2016
comment
Большое тебе спасибо!! Это то, что я искал. Задержка не такая уж большая проблема, так что это решает все :) - person cupcakearmy; 12.07.2016
comment
Готово :) Я не знал, что это так. (Мой первый вопрос о переполнении стека) - person cupcakearmy; 14.07.2016
comment
Я ценю объяснение ссылки на документацию, но это все еще сомнительный интерфейс. Возможно, было бы уместным обнаружение «невидимых» каталогов, ведущее к уведомлению, указывающему на соответствующую документацию (или предложению флага --implicit-dirs). Я не должен тратить час своего времени, пытаясь понять, что происходит. - person Kyle Baker; 02.04.2018
comment
Я помещаю это в раздел о вещах, которые я никогда бы никогда не решил без переполнения стека;) - person Matt Fletcher; 01.01.2020

В Google Cloud Storage нет папок. Различные интерфейсы используют разные уловки, чтобы притвориться, что папки существуют, но в конечном итоге есть только объект, имя которого содержит кучу косых черт. Например, «pictures / january / 0001.jpg» - это полное имя отдельного объекта.

Если вам нужно быть уверенным, что «папка» существует, поместите в нее объект.

person Brandon Yarbrough    schedule 11.07.2016
comment
Спасибо за разъяснение, уже помогает. Думаю, я тогда не очень хорошо объяснил, я изменю вопрос. - person cupcakearmy; 12.07.2016

@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, которые не видны локально, и создает их.

Это (для меня) устранило проблему с папками (и связанными объектами), не отображаемыми в структуре подключенных папок.

person mherzog    schedule 27.10.2020
comment
Если вы ссылаетесь на свой собственный скрипт, пожалуйста, укажите в своем ответе соответствующую принадлежность. В противном случае это будет считаться спамом. - person Sabito 錆兎; 27.10.2020
comment
Просто ссылка на ваш репозиторий GitHub не дает ответа на вопрос о переполнении стека. Ответы должны фактически отвечать на вопрос, без требования, чтобы пользователь переходил на какой-либо другой сайт, чтобы получить ответ. Пожалуйста, добавьте контекст вокруг ссылок. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или постоянно отключается. не более чем ссылка на внешний сайт - это причина, по которой почему и как удаляются некоторые ответы?. - person Makyen♦; 27.10.2020
comment
Спасибо за добавление аффилированности. Однако, чтобы получить настоящий ответ (ваш сценарий), все равно нужно уйти за пределы сайта. Это может быть разумным, если требуемый код превышает емкость ответа (тогда в ответе должны быть только основные части), но в этом случае сценарий подходит для ответа. В тех случаях, когда у меня есть что-то подобное, я включил код в ответ и предоставил ссылку на него на GitHub, возможно, упомянув, что версия GitHub будет самой последней. Как бы то ни было, это всего лишь объявление о том, что ваш сценарий существует, а не фактический ответ. - person Makyen♦; 30.10.2020