我希望从一个 AWS 帐户(源)中的 AWS S3 存储桶中移动大量文件,具有遵循以下模式的系统文件名:
my_file_0_0_0.csv
...
my_file_0_7_200.csv
进入另一个 AWS 账户(目标)中的 S3 存储桶。这些需要由 ec2 实例(以克服 IAM 访问限制)逐步移动到附加的 EBS 卷(以克服存储限制)。
在文件名中,有 3 个数字由下划线分隔,例如:_a_b_c
,其中 a 始终为 0,b 从 0 开始一直到 7,而 c 从 0 到最大 200(不保证它总是会达到 200)。
(我有一个通过 Putty 连接到 EC2 实例的 SSH 会话)。
所以我在第一次迭代中尝试做的是从 S3 复制所有文件,这些文件的名称具有以下模式:my_file_0_0_*.csv
. 这可以通过以下命令完成:
aws s3 cp s3://my_source_bucket_name/my_folder/ . --recursive --exclude "*" --include "my_file_0_0_*" --profile source_user
从这里,我使用以下命令将其上传到我的目标存储桶:
aws s3 cp . s3://my_target_bucket_name/my_folder/ --recursive --profile source_user
最后从 ec2 实例的 ebs 卷中删除文件rm *
。
aws s3 cp s3://my_source_bucket_name/my_folder/ . --recursive --exclude "*" --include "my_file_0_1_*" --profile source_user
这一次,我只得到了一些带有 pattern 的文件my_file_0_1_*
,因为它们的组合文件大小达到了 100 GiB,这是我的 ebs 卷的限制。在这里,我遇到了文件名按字母顺序排序的问题,而不是按名称中的数字按数字排序。例如:
my_file_0_1_0.csv
my_file_0_1_1.csv
my_file_0_1_10.csv
my_file_0_1_100.csv
my_file_0_1_101.csv
my_file_0_1_102.csv
my_file_0_1_103.csv
my_file_0_1_104.csv
my_file_0_1_105.csv
my_file_0_1_106.csv
my_file_0_1_107.csv
my_file_0_1_108.csv
my_file_0_1_109.csv
my_file_0_1_11.csv
在将它们移动到目标 S3 存储桶并从 ebs 中删除它们之后,挑战在于以my_file_0_1_*
系统的方式移动带有模式的剩余文件。有没有办法通过使用来实现这一目标,例如find
,grep
,awk
或类似的?我是否需要先将一些文件名切片转换为整数?
您可以使用sort -V
command 来考虑文件的正确版本控制,然后一次对每个文件或文件列表调用 copy 命令。
ls | sort -V
如果您使用的是 GNU 系统,您还可以使用ls -v
. 这在 MacOS 中不起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句