将bash命令与aws s3 cp命令结合

时间:2018-09-05 13:32:00

标签: bash amazon-web-services aws-cli

我需要将一些文件从Linux计算机复制到s3存储桶。我只需要复制选定的文件。我可以使用以下bash命令获取文件。

ls -1t /var/lib/pgsql/backups/full/backup_daily/test* | tail -n +8

现在,我想将此bash命令与aws s3 cp命令结合使用。我搜索没有找到下面的解决方案,但是它不起作用

ls -1t /var/lib/pgsql/backups/full/backup_daily/test* | tail -n +8  | aws s3 cp - s3://all-postgresql-backup/dev/

我该如何做?

2 个答案:

答案 0 :(得分:2)

如果您在使用GNU工具(findsorttailsed)的平台上,并且希望将所有名称插入该位置您拥有-的地方,可靠地执行此操作(以一种针对意外文件名的强大方式)可能像这样:

find /var/lib/pgsql/backups/full/daily_backup -name 'guest*' -type f -printf '%T@ %p\0' |
  sort -znr |
  tail -z -n +8 |
  sed -zEe 's/[^ ]+ //' |
  xargs -0 sh -c 'aws s3 cp "$@" s3://all-postgresql-backup/ncldevshore/' _

这里有很多东西,所以让我们逐个介绍一下:

  • ls不会生成可安全用于编程的输出。因此,我们改为使用find,并使用一个-printf字符串,该字符串在每个文件之前放置一个时间戳记(在UNIX时代,从1970年开始的秒数),并以NUL(该字符不同于换行符,在UNIX上的文件名中不能存在。
  • sort -z是GNU扩展,它由NUL界定输入和输出; -n指定数字排序(因为时间戳是数字的); -r反转排序顺序。
  • sed -z是GNU扩展,它再次用NUL而不是换行符来分隔记录。在这里,我们将记录排序后从记录中剥离时间戳。
  • xargs -0 ...告诉xargs从stdin中读取以NUL分隔的记录,并将它们附加到...的参数列表中,只要遍历最大的命令行,它就会拆分为多个调用长度。
  • sh -c '..."$@"...' _运行一个包含sh的命令的外壳程序"$@",该命令将扩展为该外壳程序传递的参数列表。 _$0的占位符。 xargs会将前一个管道产生的名称放在_之后,变成$1$2等,以便将它们放在aws上命令行来代替"$@"

参考文献:

  • BashFAQ #3-如何根据某些元数据属性(最新/最旧的修改时间,大小等)对文件进行排序或比较?
  • ParsingLs-为什么不应该解析ls
  • 的输出
  • UsingFind-请参阅“批量操作”部分,以讨论在使用xargs时不引入错误所必需的安全预防措施(上述代码遵循,但其他建议则不行)。

答案 1 :(得分:1)

您可能还想看看S3 syncs3 copy with --exclude命令。

aws s3 sync . s3://mybucket --exclude "*.jpg"

您可能有一个简单的cron作业,该作业每隔几分钟在后台运行一次,并使目录保持同步。

  

同步目录和S3前缀。递归复制新的和更新的   从源目录到目标的文件。仅创建   目标文件夹中是否包含一个或多个文件。

https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html