我需要将一些文件从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/
我该如何做?
答案 0 :(得分:2)
如果您在使用GNU工具(find
,sort
,tail
,sed
)的平台上,并且希望将所有名称插入该位置您拥有-
的地方,可靠地执行此操作(以一种针对意外文件名的强大方式)可能像这样:
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
上命令行来代替"$@"
。参考文献:
ls
xargs
时不引入错误所必需的安全预防措施(上述代码遵循,但其他建议则不行)。答案 1 :(得分:1)
您可能还想看看S3 sync
和s3 copy with --exclude
命令。
aws s3 sync . s3://mybucket --exclude "*.jpg"
您可能有一个简单的cron作业,该作业每隔几分钟在后台运行一次,并使目录保持同步。
同步目录和S3前缀。递归复制新的和更新的 从源目录到目标的文件。仅创建 目标文件夹中是否包含一个或多个文件。
https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html