22

したがって、私の問題は、マウント時にいくつかのファイルが gcsfuse に表示されないことです。それらはオンライン コンソールに表示され、gsutils で「ls」すると表示されます。また、バケットにフォルダを手動で作成すると、その中のファイルが表示されますが、最初に作成する必要があります。助言がありますか?

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

mybucket を gcsfuse でマウントして「ls」を実行すると、dir1/ok.txt のみが返されます。次に、マウント ポイントのルートにある dir1 内にフォルダー dir2 を作成すると、突然「lafu.txt」が表示されます。

4

3 に答える 3

31

デフォルトでは、gcsfuse は、名前にスラッシュが含まれるファイルによって「暗黙的に」定義されたディレクトリを表示しません。たとえば、バケットに という名前のオブジェクトが含まれている場合、 という名前dir/foo.txtのオブジェクトも存在しない限り、それを見つけることはできませんdir/

フラグを設定することでこれを回避できますが--implicit-dirs、これがデフォルトではないのには十分な理由があります。詳細については、ドキュメントを参照してください。

于 2016-07-12T03:51:00.520 に答える
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で共有しました。

このスクリプトは、GCS バケットが Linux (または同様の) システムにローカルにマウントされていることを前提としています。スクリプトはまず、GCS バケットと、バケットがマウントされている場所を指定します。次に、ローカルでは表示されない GCS バケット内のすべての「ディレクトリ」を識別し、それらを作成します。

これにより(私にとって)、マウントされたフォルダー構造にフォルダー(および関連オブジェクト)が表示されないという問題が修正されました。

于 2020-10-27T19:02:23.820 に答える