S3 对象重命名
本文所述操作适用于兼容 S3 协议的所有存储框架,包括 AWS S3、Aliyun OSS、MinIO、Ceph 等。
不知为何,截止目前,S3 协议并不包含对象重命名的接口。如果有重命名对象的需求,一般能想到的就是重新上传改名之后的对象,然后从存储桶中将原名对象删除。很明显,这种方式好比大炮打蚊子,目的达到了,累得一身汗,要是本地没有备份,还得先下载,费时费力费钱。特别是当待处理的对象的数量相当庞大的时候,如果不想持续加班一个月,那就要琢磨琢磨另辟蹊径才行。
能不能将存储桶挂载到本地,然后用本地 shell 命令操作其中的对象呢?值得一试!
挂载
使用 rclone、s3fs-fuse、goofys 等工具挂载,这里以 goofys 为例。
- 直接下载编译好的执行文件
wget https://github.com/kahing/goofys/releases/latest/download/goofys - 设置执行权限
chmod +x goofys - S3 密钥配置
mkdir ~/.aws
vi ~/.aws/credentials
# 以下是 ~/.aws/credentials 内容
[default]
aws_access_key_id = xxxxxxx
aws_secret_access_key = yyyyyyyy
- 创建挂载点
mkdir /mnt/foo - 挂载
mkdir /opt/goofys
./goofys --endpoint https://us-east.s3.aws.com bucketName /mnt/foo/
- 验证是否挂载成功。
# 列出前 10 个文件
ls /mnt/foo/ | head -n 10
# 注意:该语句并不能减少 ls 的执行时间。当文件数量过多时,可以使用通配符减少 ls 的罗列数量。
重命名
挂载成功之后,我们就可以采用 mv 或 rename 指令尝试重命名文件了,下面以 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 对象重命名的更多相关文章
- servlet操作本地文件汇总: 判断文件是否存在;文件重命名;文件复制; 获取文件属性信息,转成Json对象; 获取指定类型的文件; 查找替换.txt中的文本
package servlet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...
- 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器
不多说,直接上干货! 获取文件名称.获取文件路径.获取文件大小.获取文件修改时间 FileMethodDemo.java package zhouls.bigdata.DataFeatureSelec ...
- C#文件监控对象FileSystemWatcher实例,通过监控文件创建、修改、删除、重命名对服务器数据进行实时备份
先上图,简单的windorm界面:此为最初的版本,后续会增加监听多个源目录的功能.log功能.进度条展示功能等. 1.初始化监听 /// <summary> /// 初始化监听 /// & ...
- SQL Server ->> 存储过程sp_rename重命名数据对象
1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...
- Drupal8重命名上传的中文名文件
完整的模块代码文件在Coding.net上,想直接使用的请前往下载:https://coding.net/u/yamus/p/chinese_rename/git/tree/master 最近吧Dru ...
- Java 实现批量重命名,亲测可用(精简版)
之前在网上下载了很多视频,解压缩后,发现里面每个文件前面都有一长串的网址,导致我根本看不清每个视频的名字到底叫什么? 网上搜了一些批量重命名的方法,可都不是我想要的,既然这样,干脆自己动手用Java写 ...
- 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】
1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...
- Java用来进行批量文件重命名,批量提取特定类型文件
原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...
- 解决修改重命名sql Server数据库名称
错误: 消息 5030,级别 16,状态 2,第 1 行无法用排他锁锁定该数据库,以执行该操作. 解决方法:(原理一样) 1.将数据库设置为单用户模式 (单用户模式指定一次只有一个用户可访问数据库,该 ...
- WPF 之 TreeView右键选中节点及节点重命名
下面的TreeView节点是通过数据双向绑定的方式,绑定到TextBlock控件和TextBox控件的Text属性上,并且让两者绑定相同的属性,同时使TextBox控件刚好完全覆盖TextBlock控 ...
随机推荐
- c# 一些方法记录
// 返回当前目录的路径 fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "当前目录下的一个文件"); ...
- html页面间传递参数
$.query.get("id") jquery.params.js代码 /** * jQuery.query - Query String Modification and Cr ...
- VScode好用插件
1.Anaconda Extension Pack 可以自动补全anaconda包中的属性名称 2.Code Spell Checker 单词拼写检查,非常推荐,有时候会拼错单词,这个不仅可以指出错误 ...
- 部门mysql操作
use test_db; -- 删除表 drop table if exists t1_profit; drop table if exists t1_salgrade; drop table i ...
- Ansible 工具参数详解自动化运维
一.Ansible基本概述: Ansible是一个配置管理系统(configuration management sysytem )你只需要可以使用ssh访问你的服务器或设备就行 Ansible 是近 ...
- jenkins启动失败,查看状态提示active(exited)
chown -R jenkins:jenkins /var/lib/jenkins chown -R jenkins:jenkins /var/cache/jenkins chown -R jenki ...
- Apache Ranger系列六:Submarine Spark Security Plugin安装(0.6.0版本)
参考 https://submarine.apache.org/zh-cn/docs/0.6.0/userDocs/submarine-security/spark-security/ 从ranger ...
- [Unity工具]搭建lua环境(IDEA)
一.下载IDEA 地址:https://www.jetbrains.com/idea/ 这里我的版本是IntelliJ IDEA Community Edition 2020.2.4 x64 二.断点 ...
- linux 安装配置redis
linux 安装配置redis 安装 官网下载地址:https://redis.io/download linux下载命令:wget http://download.redis.io/releases ...
- go 发布
rm test-serv.bingo build -o test-serv.bin main.go