s3cmd复制文件保留路径

时间:2015-08-31 23:07:11

标签: amazon-s3 s3cmd

有没有办法通过保留文件路径将副本文件用于S3存储桶?

这是一个例子: 1.我使用s3cmd sync -dry-run

生成bucket1中不同的文件列表,然后在bucket2中生成

列表如下所示:

s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/definition/.content.xml
s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/nodetypes.cnd
s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/properties.xml
s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/.content.xml
s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/content/.content.xml
s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/content/app-store/.content.xml
  1. 我需要处理此列表以上传到存储桶中的新位置(例如s3:// bucket / diff /),只列出列表BUT中的文件,其中包含列表中显示的完整路径。
  2. 像这样的简单循环:

    diff_file_list=$(s3cmd -c s3cfg sync --dry-run s3://BUCKET/20150831/PROD s3://BUCKET/20150831/DEV | awk '{print $2}')
    for f in $diff_file_list; do
        s3cmd -c s3cfg cp $f s3://BUCKET/20150831/DIFF/
    done
    

    不起作用;它产生了这个:

    File s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/definition/.content.xml copied to s3://BUCKET/20150831/DIFF/.content.xml
    File s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/nodetypes.cnd copied to s3://BUCKET/20150831/DIFF/nodetypes.cnd
    File s3://BUCKET/20150831/PROD/JC-migration-test-01/META-INF/vault/properties.xml copied to s3://BUCKET/20150831/DIFF/properties.xml
    File s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/.content.xml copied to s3://BUCKET/20150831/DIFF/.content.xml
    File s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/content/.content.xml copied to s3://BUCKET/20150831/DIFF/.content.xml
    File s3://BUCKET/20150831/PROD/JC-migration-test-01/jcr_root/content/origin-store/.content.xml copied to s3://BUCKET/20150831/DIFF/.content.xml
    

    谢谢,

1 个答案:

答案 0 :(得分:0)

简答:不是不是!这是因为S3存储桶中的路径实际上不是目录/文件夹,并且S3存储桶没有这样的结构概念,即使各种工具以这种方式呈现它(包括s3cmd实际上令人困惑......)。

因此,“path”实际上是一个前缀(尽管sc3cmd同步到本地知道如何在文件系统的目录结构中转换此前缀)。

对于bash脚本,解决方案是: 1.创建一个文件列出s3cmd sync -dry-run命令的所有路径(基本上是差异列表)=>文件1

  1. 复制该文件并使用sed根据需要修改路径: sed's /(^ s3。*)PROD / \ 1DIFF /')=> file2的

  2. 合并文件,以便file1中的line1由file2中的line1继续,依此类推: paste file1 file2> final.txt

  3. 在循环中逐行读取final.txt,并将每行用作复制或syun命令的2个参数的集合:

  4. 而IFS =''读-r line || [[-n“$ line”]];做     s3cmd -c s3cfg同步$ line 完成< “final.txt”

    注意: 1. s3cmd中的$ line不能用引号括起来;如果是同步命令会抱怨它只收到一个参数......当然! 2.这里使用了[[-n“$ line”]],这样最后一行的读取不会失败没有换行符号

    不幸的是,Boto无法帮助更多,所以如果你在python中需要类似的东西,那么你也可以这样做....