今天想删除青云bucket的文件夹 但是发现非常坑的一点是它一次最多只让删除1000个文件 可是我的文件夹有10几万的文件 所以我就写了个脚本来解决这个问题
环境的配置可以参考我的上一片文章
https://blog.youkuaiyun.com/tongcheng985/article/details/145535829?spm=1001.2014.3001.5501
环境配置好了以后就在文本编辑器里输入下面的代码(删除文件夹的路径结尾要有/)
#!/bin/bash
# 配置青云S3的Endpoint、Access Key和Secret Key
export AWS_ACCESS_KEY_ID="" # 替换为你的Access Key
export AWS_SECRET_ACCESS_KEY="" # 替换为你的Secret Key
QINGCLOUD_S3_ENDPOINT="https://s3.qingstor.com" # 替换为你的Endpoint
# 配置S3存储桶和文件夹路径
BUCKET_NAME="" # 替换为你的存储桶名称
S3_FOLDER_PATH="/" # 替换为你要删除的文件夹路径
# 并发线程数
MAX_THREADS=10 # 增加并发线程数以提高性能
# 日志文件路径(记录删除的文件)
LOG_FILE="s3_delete.log"
# 检查 s5cmd 是否已安装
if ! command -v s5cmd &> /dev/null; then
echo "s5cmd 未安装,正在安装..."
wget https://github.com/peak/s5cmd/releases/download/v2.0.0/s5cmd_2.0.0_Linux-64bit.tar.gz
tar -xvf s5cmd_2.0.0_Linux-64bit.tar.gz
sudo mv s5cmd /usr/local/bin/
if [ $? -ne 0 ]; then
echo "安装 s5cmd 失败,请手动安装后重试。"
exit 1
fi
fi
# 获取要删除的文件总数
echo "正在统计待删除文件数量..."
TOTAL_FILES=$(s5cmd --endpoint-url "$QINGCLOUD_S3_ENDPOINT" ls "s3://$BUCKET_NAME/$S3_FOLDER_PATH*" | wc -l)
echo "找到 $TOTAL_FILES 个文件待删除。"
# 提示用户确认
read -p "确认删除 s3://$BUCKET_NAME/$S3_FOLDER_PATH 下的 $TOTAL_FILES 个文件?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "操作已取消。"
exit 0
fi
# 中断处理函数
handle_interrupt() {
echo -e "\n检测到中断信号,正在停止删除操作..."
DELETED_FILES=$(grep -c "rm s3://" "$LOG_FILE")
echo "已删除 $DELETED_FILES/$TOTAL_FILES 个文件。"
exit 1
}
# 捕获中断信号
trap handle_interrupt SIGINT
# 删除文件并实时输出进程
echo "开始删除文件(日志保存到 $LOG_FILE)..."
s5cmd --endpoint-url "$QINGCLOUD_S3_ENDPOINT" --numworkers "$MAX_THREADS" rm "s3://$BUCKET_NAME/$S3_FOLDER_PATH*" 2>&1 | \
tee "$LOG_FILE" | \
while IFS= read -r line; do
if [[ "$line" == *"rm s3://"* ]]; then
FILE_PATH=$(echo "$line" | awk '{print $2}')
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已删除: $FILE_PATH"
fi
done
# 统计已删除文件数量
DELETED_FILES=$(grep -c "rm s3://" "$LOG_FILE")
echo "删除完成!已删除 $DELETED_FILES/$TOTAL_FILES 个文件。"
然后在终端输入
chmod +x
再把脚本拖到里面
最后 再单独把脚本拖到终端里面 回车执行