したがって、私の問題は、マウント時にいくつかのファイルが gcsfuse に表示されないことです。それらはオンライン コンソールに表示され、gsutils で「ls」すると表示されます。また、バケットにフォルダを手動で作成すると、その中のファイルが表示されますが、最初に作成する必要があります。助言がありますか?
gs://mybucket/
dir1/
ok.txt
dir2
lafu.txt
mybucket を gcsfuse でマウントして「ls」を実行すると、dir1/ok.txt のみが返されます。次に、マウント ポイントのルートにある dir1 内にフォルダー dir2 を作成すると、突然「lafu.txt」が表示されます。
3 に答える
デフォルトでは、gcsfuse は、名前にスラッシュが含まれるファイルによって「暗黙的に」定義されたディレクトリを表示しません。たとえば、バケットに という名前のオブジェクトが含まれている場合、 という名前dir/foo.txt
のオブジェクトも存在しない限り、それを見つけることはできませんdir/
。
フラグを設定することでこれを回避できますが--implicit-dirs
、これがデフォルトではないのには十分な理由があります。詳細については、ドキュメントを参照してください。
@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 バケット内のすべての「ディレクトリ」を識別し、それらを作成します。
これにより(私にとって)、マウントされたフォルダー構造にフォルダー(および関連オブジェクト)が表示されないという問題が修正されました。