如何编写Shell脚本读取文件并自动执行SCP文件复制任务
完善后的Shell脚本实现方案
假设你的输入文本文件(比如paths.txt)每行格式为目标路径 源路径,示例内容如下:
/shared36/docs/report1 /ftpvolume/uploads/202405
/shared36/docs/report2 /ftpvolume/uploads/202406
以下是完善后的脚本,包含完整的scp执行逻辑与基础错误处理:
#!/bin/bash # 检查是否传入了路径文件参数 if [ $# -ne 1 ]; then echo "使用方法: $0 <路径文件路径>" exit 1 fi PATH_FILE="$1" # 检查路径文件是否存在 if [ ! -f "$PATH_FILE" ]; then echo "错误: 文件 $PATH_FILE 不存在" exit 1 fi # 逐行读取文件内容 while read -r target_path source_path; do # 验证路径格式是否符合要求 if [[ ! "$target_path" =~ ^/shared36 ]]; then echo "警告: 目标路径 $target_path 不符合格式要求,跳过该行" continue fi if [[ ! "$source_path" =~ ^/ftpvolume ]]; then echo "警告: 源路径 $source_path 不符合格式要求,跳过该行" continue fi source_file="${source_path}/ABC.PDF" # 检查源文件是否存在 if [ ! -f "$source_file" ]; then echo "错误: 源文件 $source_file 不存在,跳过该行" continue fi # 创建目标目录(如果不存在) mkdir -p "$target_path" # 执行scp命令复制文件 echo "正在复制 $source_file 到 $target_path..." if scp "$source_file" "$target_path/"; then echo "复制成功: $source_file -> $target_path" else echo "复制失败: $source_file -> $target_path" fi done < "$PATH_FILE" echo "所有任务执行完毕"
关键功能说明
- 参数校验:脚本启动时检查是否传入了正确的路径文件参数,避免无意义执行
- 格式验证:确保每行的目标路径以
/shared36开头、源路径以/ftpvolume开头,不符合则跳过 - 文件存在性检查:复制前先确认源文件
ABC.PDF是否存在,避免无效scp调用 - 目标目录创建:自动创建不存在的目标路径,防止因目录缺失导致复制失败
- 执行反馈:每个复制任务都会输出明确的成功/失败提示,方便排查问题
使用注意事项
- 确保输入文件每行仅包含两个路径,用空格分隔,不要有多余空格或换行
- 如果目标路径是远程服务器路径(比如
user@host:/shared36/...),需确保当前用户已配置免密登录,避免每次输入密码 - 若需要调试scp过程,可以在
scp命令后添加-v参数(即scp -v "$source_file" "$target_path/")查看详细日志 - 脚本需要有读取源文件、写入目标路径的权限,可根据需求添加
sudo(谨慎使用)
内容的提问来源于stack exchange,提问作者abdul arshad
相关产品推荐
相关产品推荐

