如何通过通配符匹配目录,从S3下载文本文件且不含父目录?
解决AWS S3下载文件时不保留父目录的问题
你的需求很明确——要下载S3桶里以指定前缀命名的目录下的所有txt文件,但不想把这些文件放在对应的子目录里,直接下载到当前工作目录就行。原来的aws s3 cp命令因为递归下载的特性,会自动保留S3上的目录结构,所以才会出现文件被包裹在父目录里的情况。
这里有两种可行的解决方法,你可以根据自己的场景选择:
方法一:通过脚本逐个下载(推荐,完全扁平化)
这种方法先列出所有符合条件的文件,然后逐个提取文件名,直接下载到当前目录,彻底去掉父目录结构。
运行以下脚本:
aws s3 ls s3://mybucket/ --recursive | grep "mydirectory.*\.txt$" | awk '{print $4}' | while read file_path; do # 提取文件名,去掉前面的目录路径 file_name=$(basename "$file_path") # 下载文件到当前目录 aws s3 cp "s3://mybucket/$file_path" "./$file_name" done
注意事项:
- 如果不同目录下有同名的txt文件,后面下载的文件会覆盖前面的,要是担心这个问题,可以修改
file_name的生成逻辑,比如把目录前缀也加进去:file_name=$(echo "$file_path" | sed 's/\//_/g'),这样文件名会变成类似mydirectory1_file.txt的形式,避免冲突。 - 确保你有足够的权限执行
aws s3 ls和aws s3 cp操作。
方法二:调整cp命令参数(部分场景适用)
如果你的目标目录下没有子目录(只有一级目录),可以调整--exclude和--include的规则,同时结合--exclude-dir来排除目录本身,但这种方法有一定限制——如果目录里还有更深的子目录,子目录里的txt文件还是会带着子结构下载下来:
aws s3 cp s3://mybucket/ . --recursive --exclude "*" --include "mydirectory*/*.txt" --exclude-dir "mydirectory*"
内容的提问来源于stack exchange,提问作者Set
相关产品推荐
相关产品推荐

