请求编写Bash脚本:迁移指定前缀文件至远程服务器并删除源文件
Bash脚本实现指定前缀文件跨服务器迁移(保留目录结构+删除源文件)
核心方案推荐:使用rsync(高效简洁)
rsync是处理文件同步/迁移的首选工具,它支持递归遍历目录、自动创建目标路径,并且可以直接在传输完成后删除源文件,完美匹配你的需求。
执行命令(直接在Server1上运行)
rsync -av \ --include='*/' \ # 包含所有子目录(保证目录结构完整) --include='a*' \ # 只保留前缀为a的文件 --exclude='*' \ # 排除其他所有文件 /dummy/ \ # 源目录末尾加/表示传输目录内的内容,而非目录本身 user@Server2:/demo/ \ # 替换为实际的Server2用户名和地址 --remove-source-files # 传输成功后删除Server1上的源文件
参数解释
-a:归档模式,保留文件权限、时间戳等属性,同时递归遍历目录-v:verbose模式,显示传输过程(可选,调试时开启)--include='*/':必须先包含所有子目录,否则rsync会跳过无匹配文件的目录,导致目录结构丢失--include='a*':筛选前缀为a的文件--exclude='*':排除其他未匹配的文件--remove-source-files:仅在文件成功传输后删除Server1上的源文件(不会删除空目录,若需清理空目录可后续执行find /dummy -type d -empty -delete)
备选方案:使用find+scp(逻辑直观,适合新手理解)
如果对rsync的筛选规则不太熟悉,可以用find遍历文件,再逐个用scp传输,手动处理目录结构和删除操作。
脚本示例
#!/bin/bash # 配置参数 SOURCE_ROOT="/dummy" DEST_ROOT="/demo" REMOTE_USER="user" # Server2的用户名 REMOTE_HOST="Server2" # Server2的IP或主机名 # 遍历所有前缀为a的文件 find "$SOURCE_ROOT" -type f -name "a*" | while read -r src_file; do # 计算文件相对于源根目录的路径 rel_path="${src_file#$SOURCE_ROOT/}" # 远程目标目录 dest_dir="$DEST_ROOT/$(dirname "$rel_path")" # 远程目标文件路径 dest_file="$REMOTE_USER@$REMOTE_HOST:$dest_dir/$(basename "$rel_path")" # 在远程服务器创建目标目录(-p参数自动创建多级目录) ssh "$REMOTE_USER@$REMOTE_HOST" "mkdir -p '$dest_dir'" # 传输文件 scp "$src_file" "$dest_file" # 检查传输是否成功,成功则删除源文件 if [ $? -eq 0 ]; then rm "$src_file" echo "已删除源文件: $src_file" else echo "传输失败,保留源文件: $src_file" fi done # 可选:删除Server1上遗留的空目录 find "$SOURCE_ROOT" -type d -empty -delete
关键注意事项
- SSH免密登录配置:确保Server1可以无密码登录到Server2,否则脚本执行过程中会反复要求输入密码。可通过
ssh-keygen生成密钥,再用ssh-copy-id user@Server2完成配置。 - 测试验证:正式执行前,建议去掉
--remove-source-files(rsync方案)或注释rm "$src_file"(scp方案),先验证传输后的目录结构和文件是否符合预期,再启用删除操作。 - 权限问题:确保Server1上的执行用户对/dummy目录有读取权限,Server2上的用户对/demo目录有写入权限。
内容的提问来源于stack exchange,提问作者Siddharth Gandhi
相关产品推荐
相关产品推荐

