83 lines
3.3 KiB
Bash
83 lines
3.3 KiB
Bash
#!/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 "文件传输完成!"
|