默认情况下,“s3 同步”似乎不会在目标目录中创建空文件夹
aws s3 sync s3://source-bucket s3://dest-bucket --include "*" --recursive
我现在已经搜索了几个小时,似乎找不到任何东西可以在使用“sync”或“cp”时解决空文件夹/目录
fwiw,我确实看到以下消息可能与空文件夹有关,但很难确定,因为源存储桶非常大且难以操作。
Completed 4132 of 4132 part(s) with -5 file(s) remaining
S3 没有目录的概念。 S3 是一个对象存储,其中每个对象都由一个键标识。 键可能是像“logs/2014/06/04/system.log”这样的字符串
S3 之上的大多数图形用户界面(AWS CLI、AWS Console、Cloudberry、Transmit 等)将“/”字符解释为目录分隔符,并“按原样”呈现目录结构中的文件列表。
但是,在内部,没有目录的概念,S3有一个扁平的命名空间。 请参阅 http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html 了解更多详细信息。
知道了这一点,我对空目录不同步并不感到惊讶,因为 S3 上没有目录
到目前为止还没有办法,但已开放功能请求以添加复制空目录的功能。
目前还没有官方的办法。
您可以使用S3cmd代替官方AWS客户端,我已经读到它支持同步空目录。
或者,您可以使用 bash 将文件添加到空目录:
find . -type d -empty -exec touch {}/empty.txt \;
离题但相关:我不希望符号链接文件被重复(链接文件是本地时的默认设置),但我确实想保留结构(--no-follow-symlinks 只是忽略链接)。因此,只需将链接复制到文本文件即可:
find . -type l -exec bash -c 'readlink "$1" > "$1.symlink"' _ {} \;
这是一个老问题,但仍然相关,所以我会回答它。
我遇到过这个问题,我通过在名为 .folderkeep 的文件夹中创建一个空文件来解决它,其中没有数据。因此,当您同步它时,它将创建该文件夹。
它只是存在于一个文件夹中。与其他数据无关。而且它以“.”开头,所以它会对文件系统隐藏。
aws s3 sync
命令不会在目标中创建空目录。这就是我在目标 S3 存储桶中创建空目录以与源 S3 存储桶匹配的方法(您可以在 CloudShell / Bash shell 中运行它):
#导出变量(请酌情修改变量值)
source_bucket_name="SOURCE_S3_BUCKET_NAME"
destination_bucket_name="DESTINATION_S3_BUCKET_NAME"
input_file="空目录.txt"
# 将空目录列表导出到名为“empty-directories.txt”的文件
aws s3api list-objects-v2 --bucket $source_bucket_name --query 'Contents[].{Key: Key}' | jq -r '.[] | select(.Key | endswith("/")) | .Key' > empty-directories.txt
# 在目标S3存储桶中创建空目录
while IFS= read -r folder_name || [ -n "$folder_name" ]; do
# Ensure the folder name ends with a trailing slash
folder_key="${folder_name%/}/"
# Create the directory in the destination bucket
aws s3api put-object --bucket "$destination_bucket_name" --key "$folder_key"
echo "Created folder: $folder_key in bucket: $destination_bucket_name"
done < "$input_file"