2015-08-31 146 views
-2

是否存在被保留的文件路径使用拷贝文件到S3存储的方法吗?s3cmd复制文件保存路径

这是例子: 1.我生产使用s3cmd同步--dry运行

名单是在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 
  • 我需要处理该列表上传到一个新的位置在桶(例如S3://桶/比较/)仅在列表中但与完整路径,如图中的文件列表。
  • 一个简单的循环是这样的:

    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 
    

    感谢,

    +0

    你手里有$ f,所以做一些基本的编辑,使用sed/awk或相当于产生$ g,其中包含完整,正确的目标文件名,然后复制$ f到$ g。 – jarmod

    +0

    是的,我结束了使用sed重复该行并将PROD替换为DIFF。然后,我逐一读取这些行,并将它们作为参数传递给sync命令。不是非常优雅,但工作.... –

    回答

    0

    简短的回答:不是不是!这是因为在S3桶的路径是不实际的目录/文件夹和S3存储具有即使各种工具都呈现这种方式(包括s3cmd这实在是混乱...)结构没有这样的概念。

    所以,“路径”实际上是一个前缀(虽然sc3cmd同步到本地懂得这个前缀的目录结构上文件系统转换)。

    对于bash脚本的解决办法是: 1.创建一个文件列表从s3cmd同步--dry运行命令(基本上是diff文件的列表)=>所有路径的file1

  • 复制该文件,并用sed修改的路径根据需要: SED的/(^ S3 *)PROD/\ 1DIFF /')=> file2的

  • 合并文件,以便LINE1 file1中由file2中第1行等继续: 膏文件1文件2> final.txt

  • final.txt阅读,一行行,在循环中,并使用每行作为一组的2个参数,以复制或瞬命令:

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

    注:在s3cmd不能在引号 1 $线;如果是sync命令会抱怨说,它接受一个参数只有...当然! 2. [[-n“$ line”]]在这里使用,以便读取不会失败的最后一行没有新行字符

    Boto无法帮助更多不幸,所以如果你需要类似的python你会做得差不多相同......