我在尝试列出我的 s3 存储桶中某个目录中的匹配文件时遇到了几个问题。
我一直在使用 ls 创建特定目录中所有文件的列表(包括时间戳和文件大小),方法是将其附加到新文件,例如 aws s3 --profile mybucket1 ls s3://my-bucket1/directory1/directory2/>> list.txt
.
这既快速又按预期工作。但是,我也想列出 directory1 中的一些文件,但只有与特定字符串匹配且周围带有通配符的某些文件。
我最接近实现这一目标的方法是使用 cp(使用 --exclude 和 --include)而不是 ls,因为 ls 不允许您使用 --exclude 或 --include 选项,例如 aws s3 --profile mybucket1 cp s3://my-bucket1/directory1//path/to/local/directory/--exclude "*"--include "*match-me*"--recursive
但它甚至需要永远复制单个文件(我没有得到任何标准输出,因为我相信它会在复制任何内容之前扫描整个目录以查找匹配的字符串)。我也无法删除 --recursive,因为如果没有它,它会给我一个错误,即使我只想复制 directory1 中的文件。
我更喜欢为此使用 ls,因为它更快,而且我不必再对下载的文件执行另一个 ls 以生成与我从目录 2 列出和附加的文件相同的格式。
此外,我在 bash 脚本中运行所有这些命令,以防有任何不同。
我希望这是有道理的,如果有人对此有任何可能的解决方案,我们将不胜感激。
最佳答案
如果您的模式位于键的开头并且您想要匹配
match-me*
,您可以使用--prefix
参数:aws s3api list-objects --bucket <bucket> --prefix "match-me"
将返回以match-me
开头的所有键
如果您的模式位于键名的中间并且您想要匹配
*match-me*
,您可以对结果运行查询:aws s3api list-objects --bucket test-bucket-fh --query "Contents[?contains(Key, 'match-me')]"
关于linux - 有没有办法使用 ls 和通配符从 s3 存储桶中提取文件? (aws 客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331037/