Some-Shell/rclone/transport/transport.sh

83 lines
3.3 KiB
Bash
Raw Normal View History

2024-07-14 15:44:33 +08:00
#!/bin/bash
# 定义原数据网盘和目标网盘列表
originalgdrive="gMediaOriginal:" # 使用 rclone 的远程名
target_drives=("gtrandall:" "gtuser1:" "gtuser2:" "gtuser3:" "gtuser4:") # 使用 rclone 的远程名
# 初始化计数器
counter=0
# 初始化失败文件列表
failed_files=()
function process_directory {
local current_path="$1"
local items_json=$(rclone lsjson "$originalgdrive$current_path")
# 读取 json 输出并解析文件和目录
echo "$items_json" | jq -c '.[]' | while read -r item; do
((counter++))
local name=$(echo "$item" | jq -r '.Path')
local is_dir=$(echo "$item" | jq -r '.IsDir')
if [ "$is_dir" == "true" ]; then
# 是目录使用不同的gtransport创建目标目录并递归处理
local new_path="$current_path$name/"
local dest_index=$((counter % ${#target_drives[@]}))
local dest_drive="${target_drives[$dest_index]}"
echo "检查目录是否存在 $dest_drive$new_path"
if ! rclone lsf "$dest_drive$new_path" > /dev/null 2>&1; then
echo "创建目录 $dest_drive$new_path"
if ! rclone mkdir "$dest_drive$new_path"; then
((counter++))
echo "创建目录 $dest_drive$new_path 失败,尝试使用下一个传输器"
dest_index=$((counter % ${#target_drives[@]}))
dest_drive="${target_drives[$dest_index]}"
if ! rclone mkdir "$dest_drive$new_path"; then
echo "第二次尝试失败。将 $dest_drive$new_path 添加到失败文件列表。"
failed_files+=("$dest_drive$new_path")
fi
fi
else
echo "目录已存在 $dest_drive$new_path"
fi
process_directory "$new_path"
else
# 是文件,检查是否是中断的文件
local src="$originalgdrive$current_path$name"
# 先递增计数器,然后使用更新后的计数器值选择目标网盘
local dest_index=$((counter % ${#target_drives[@]}))
local dest_drive="${target_drives[$dest_index]}"
local dest="$dest_drive$current_path"
echo "检查文件是否存在 $dest$name"
if ! rclone lsf "$dest$name" > /dev/null 2>&1; then
echo "复制 $src$dest"
if ! rclone copy "$src" "$dest" --progress; then
((counter++))
echo "复制 $src$dest 出错,尝试使用下一个传输器"
dest_index=$((counter % ${#target_drives[@]}))
dest_drive="${target_drives[$dest_index]}"
dest="$dest_drive$current_path"
echo "复制 $src$dest"
if ! rclone copy "$src" "$dest" --progress; then
echo "第二次尝试失败。将 $src 添加到失败文件列表。"
# 如果两次都失败,则记录失败的文件
failed_files+=("$src")
fi
fi
else
echo "文件已存在 $dest$name"
fi
fi
done
}
# 开始处理根目录
process_directory ""
echo "文件传输完成!"