linux - 有没有办法使用 ls 和通配符从 s3 存储桶中提取文件? (aws 客户端)

标签 linux bash shell aws-cli

我在尝试列出我的 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 脚本中运行所有这些命令,以防有任何不同。

我希望这是有道理的,如果有人对此有任何可能的解决方案,我们将不胜感激。

最佳答案

你应该看看aws s3api list-objects

  1. 如果您的模式位于键的开头并且您想要匹配 match-me*,您可以使用 --prefix 参数:

    aws s3api list-objects --bucket <bucket> --prefix "match-me" 
    

    将返回以match-me

  2. 开头的所有键
  3. 如果您的模式位于键名的中间并且您想要匹配 *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/

相关文章:

linux - 将文件读入变量,然后用转义字符替换控制字符

linux - 用于关闭/重启 Linux 系统的 shell 脚本

linux - 使用 gnuplot 将页面附加到现有的 Postscript 文件

linux - 如何在 Red Hat 3.4.6-3 中安装 yum

c - 需要在 shell 脚本中获取 C 程序名称

bash - 在 Unix 中,如何删除当前目录及其下的所有内容?

bash - 从Docker容器A(在Docker容器B上)运行Bash脚本

linux - 当 Openldap 服务器上的 slapd 守护进程停止时,Openldap 客户端计算机挂起

linux - openembedded-core 和 poky 的区别

c - c程序中bash sleep和sleep的区别