我想重命名我在AWS S3存储桶中的pdf文件,将它们的名称从我们使用的某种数字更改为PostgreSQL表中的UUID。
目前,我正在尝试这样做:
export PGPASSWORD="<my_password>"
echo "SELECT id, number FROM mytable" \
| psql -h <local-docker-ip> -p <docker-port> -U <user> \
| head -n -2 \ # this is only for eliminating extra text
| awk 'NR > 2 { aws s3 --profile Admin-Profile mv "s3://<bucket>/documents/" $3 ".pdf" " " "s3://<bucket>/documents/" $1 ".pdf" }'
我在awk
中使用的字符串连接可能是错误的,但我不知道如何解决它。当然,如果有人知道更好的方法,我愿意接受建议。
2条答案
按热度按时间zpjtge221#
在
awk
中,实际上有一种方法可以使用system()
函数或通过管道传输到系统命令中的print语句来执行shell命令,这实际上可以用于直接执行AWS CLI命令。但是,在我们继续之前,重要的是要了解在awk中使用system()
或管道将为每个命令创建一个新的shell,如果您正在处理大量数据,则会显着较慢并消耗更多资源。这就是为什么生成脚本然后运行它通常更有效的原因。如果你仍然对这种方法感兴趣,你可以像这样修改你的awk
命令:sprintf
函数用于生成命令字符串,然后system()
函数用于执行它。请记住,直接从awk
运行shell命令应该谨慎,因为命令将按原样运行,而不会检查错误或意外情况。如果您的环境中存在SQL注入或其他恶意活动的风险,那么第一种方法(生成脚本然后运行它)会更安全。hzbexzde2#
主要问题可能是由于您试图在
awk
语句中使用AWS CLI命令的方式。awk
不是shell,因此不能直接执行shell命令。一个可能的解决方案是使用
awk
生成包含所有必要AWS CLI命令的shell脚本,然后执行该脚本。以下是如何修改代码:然后你可以运行这个脚本(确保它是可执行的):
这段代码基于PostgreSQL查询的输出,用
aws s3 mv
命令构造一个shell脚本aws_commands.sh
,然后执行该脚本。需要注意的一点是
awk
命令中printf
的用法。这允许您将输出格式化为字符串,其中%s
将按顺序替换为以下参数。另外,请记住,应该使用$
引用shell变量。请确保在执行之前检查
aws_commands.sh
的正确性。如果要重命名的文件数量很大,请考虑先在一小部分文件上测试脚本。此外,如果您要处理大量文件,这种方法可能会有性能问题,因为它对每个文件执行单独的
aws s3 mv
命令。如果性能成为问题,您可能需要考虑使用AWS SDK for Python(Boto3)来更有效地执行这些操作。