本文所述操作适用于兼容 S3 协议的所有存储框架,包括 AWS S3Aliyun OSSMinIOCeph 等。


不知为何,截止目前,S3 协议并不包含对象重命名的接口。如果有重命名对象的需求,一般能想到的就是重新上传改名之后的对象,然后从存储桶中将原名对象删除。很明显,这种方式好比大炮打蚊子,目的达到了,累得一身汗,要是本地没有备份,还得先下载,费时费力费钱。特别是当待处理的对象的数量相当庞大的时候,如果不想持续加班一个月,那就要琢磨琢磨另辟蹊径才行。

能不能将存储桶挂载到本地,然后用本地 shell 命令操作其中的对象呢?值得一试!

挂载

使用 rclones3fs-fusegoofys 等工具挂载,这里以 goofys 为例。

  1. 直接下载编译好的执行文件wget https://github.com/kahing/goofys/releases/latest/download/goofys
  2. 设置执行权限chmod +x goofys
  3. S3 密钥配置
mkdir ~/.aws
vi ~/.aws/credentials # 以下是 ~/.aws/credentials 内容
[default]
aws_access_key_id = xxxxxxx
aws_secret_access_key = yyyyyyyy
  1. 创建挂载点mkdir /mnt/foo
  2. 挂载
mkdir /opt/goofys
./goofys --endpoint https://us-east.s3.aws.com bucketName /mnt/foo/
  1. 验证是否挂载成功。
# 列出前 10 个文件
ls /mnt/foo/ | head -n 10
# 注意:该语句并不能减少 ls 的执行时间。当文件数量过多时,可以使用通配符减少 ls 的罗列数量。

重命名

挂载成功之后,我们就可以采用 mvrename 指令尝试重命名文件了,下面以 perl 版本的 rename 为例(该版本支持正则表达式)。

# 所有文件名只保留后 5 个字符,并更改扩展名
rename 's/\w*?(\w{5})\.mdi/$1.obj/' *
# 实际也是逐个文件处理,而非一次性同时处理,文件多则耗时
# 如果文件太多则会报 "Argument list too long"(虽然参数只有一个星号,但实则是将所有文件名查找出来后执行),可以改成如下方式:
find . -name "*" | xargs rename 's/\w*?(\w{5})\.mdi/$1.obj/'
# 虽然不会报错,但其实只是将查找文件名环节转给了 find,总耗时是一样的

为了更好更灵活地重命名巨量文件,只能编写脚本了。以下是示例代码:

rename_s3_objects()
{
local renamedCnt=0
for obj in ./*
do
rename 's/\w*?(\w{5})\.mdi/$1.obj/' $obj
renamedCnt=$(($renamedCnt + 1))
if [ `expr $renamedCnt % 100` -eq 0 ]; then
# 每处理完 100 个对象就输出提示
echo "$renamedCnt objects renamed"
fi
done
return 0
} rename_s3_objects # 似乎 ``; $[]; $(()) 都可以执行运算

保存后,在命令行中使用 sh saved_file_name 执行即可。

经测算,在普通网络环境下,每重命名 100 个对象(大约 100M),耗时 70s 左右。并未检查过程中是否涉及到对象的传输(博主试验的服务器并没有带宽使用数据),推测应该是没有,有兴趣的朋友可以验证下。


除重命名外,类似于[批量]删除、创建文件夹( S3 中对象加斜杠前缀)等指令应该也可以通过挂载方式玩转。

S3 对象重命名的更多相关文章

  1. servlet操作本地文件汇总: 判断文件是否存在;文件重命名;文件复制; 获取文件属性信息,转成Json对象; 获取指定类型的文件; 查找替换.txt中的文本

    package servlet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  2. 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器

    不多说,直接上干货! 获取文件名称.获取文件路径.获取文件大小.获取文件修改时间 FileMethodDemo.java package zhouls.bigdata.DataFeatureSelec ...

  3. C#文件监控对象FileSystemWatcher实例,通过监控文件创建、修改、删除、重命名对服务器数据进行实时备份

    先上图,简单的windorm界面:此为最初的版本,后续会增加监听多个源目录的功能.log功能.进度条展示功能等. 1.初始化监听 /// <summary> /// 初始化监听 /// & ...

  4. SQL Server ->> 存储过程sp_rename重命名数据对象

    1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...

  5. Drupal8重命名上传的中文名文件

    完整的模块代码文件在Coding.net上,想直接使用的请前往下载:https://coding.net/u/yamus/p/chinese_rename/git/tree/master 最近吧Dru ...

  6. Java 实现批量重命名,亲测可用(精简版)

    之前在网上下载了很多视频,解压缩后,发现里面每个文件前面都有一长串的网址,导致我根本看不清每个视频的名字到底叫什么? 网上搜了一些批量重命名的方法,可都不是我想要的,既然这样,干脆自己动手用Java写 ...

  7. 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】

    1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...

  8. Java用来进行批量文件重命名,批量提取特定类型文件

    原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...

  9. 解决修改重命名sql Server数据库名称

    错误: 消息 5030,级别 16,状态 2,第 1 行无法用排他锁锁定该数据库,以执行该操作. 解决方法:(原理一样) 1.将数据库设置为单用户模式 (单用户模式指定一次只有一个用户可访问数据库,该 ...

  10. WPF 之 TreeView右键选中节点及节点重命名

    下面的TreeView节点是通过数据双向绑定的方式,绑定到TextBlock控件和TextBox控件的Text属性上,并且让两者绑定相同的属性,同时使TextBox控件刚好完全覆盖TextBlock控 ...

随机推荐

  1. MySQL数据库sql_mode导致varchar字段超过长度被截断插入

    django数据库设置sql_mode MySQL的sql_mode解析与设置 mysql中sql_mode的修改 sql_mode:它定义了MySQL应该支持的sql语法,对数据的校验等等. 问题 ...

  2. [C#]接口Interface快速Demo

    参考代码1: using System; namespace InterfaceDemo { /// <summary> /// 定义一个爬树接口 /// </summary> ...

  3. 【js】js执行机制-js单线程-同步和异步

    js是单线程 即同一个时间只能做一件事,JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的.比如我们对某个DOM元素进行添加和删除操作,不能同时进行.应该先进行添加,之后在进行删除. ...

  4. 02 docker的基本用法

    本章内容 1.OCI 2.docker核心组件--Cgroup与runC 3.docker的架构 4.docker的基本操作 5.安装docker环境 6.创建第一个容器 6.docker容器的状态变 ...

  5. 【帆吖】Java学习零基础22

    Java数组

  6. <context:component-scan/>和<mvc:annotation-driven/>的区别

    1 <context:annotation-config/> 如果你想使用@Autowired注解,那么就必须事先在 spring 容器中声明 AutowiredAnnotationBea ...

  7. 21206134-赵景涛-第三次blog总结

    一.前言: 本次Blog是对之前发布的PTA题目集的总结性Blog,这几次的作业题量,难度都不大,但都趋近于完成一整个系统,而非只实现部分的功能.题目集九.十也不在给出类图,而是要求自己设计.我认为这 ...

  8. go 发布

    rm test-serv.bingo build -o test-serv.bin main.go

  9. gitlab-ce安装

    # vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=Gitlab CE Repository baseurl=https://mirrors. ...

  10. CSP2022-S游寄

    游寄游寄,顾名思义,边游边寄 11.00AM 起床 复习了一下各种终端命令,然后又复习了一下对拍 虽然都没用到 然后接着睡. 有点小紧张,毕竟一年没搞OI 12.00AM 今天吃河虾 还行,只是有点扎 ...