本文所述操作適用于兼容 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 中物件加斜杠前綴)等指令應該也可以通過掛載方式玩轉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551089.html
標籤:其他
上一篇:GPT4有那么可怕嗎?
下一篇:返回列表
