You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash Shell读取配置文件生成键值对并实现文件迁移

嘿,我来帮你把这个文件迁移的Shell脚本捋明白!针对你的custom_target.config配置文件,我整理了一套稳健且高效的实现方案,既解决行拆分的问题,也兼顾了错误处理和灵活性。

最优文件迁移Shell脚本方案

核心思路

  1. 安全读取配置文件的每一行(包括末尾无换行的情况)
  2. 跳过空行和注释行,让配置文件更易维护
  3. 精准拆分每行的源文件名和目标目录
  4. 前置检查:确认源文件存在、自动创建目标目录(含父目录)
  5. 执行迁移/复制操作,并给出清晰的成功/失败提示

完整脚本示例

#!/bin/bash

# 配置文件路径,可根据实际修改
CONFIG_FILE="custom_target.config"

# 第一步:检查配置文件是否存在
if [[ ! -f "$CONFIG_FILE" ]]; then
    echo "❌ 错误:配置文件 $CONFIG_FILE 不存在,请确认路径!"
    exit 1
fi

# 第二步:循环读取配置文件的每一行
while IFS= read -r line || [[ -n "$line" ]]; do
    # 跳过空行和以#开头的注释行
    [[ "$line" =~ ^[[:space:]]*$ ]] && continue
    [[ "$line" =~ ^[[:space:]]*# ]] && continue

    # 拆分当前行的源文件和目标目录
    read -r src_file dest_dir <<< "$line"

    # 检查源文件是否存在
    if [[ ! -f "$src_file" ]]; then
        echo "⚠️ 警告:源文件 $src_file 不存在,跳过该行处理"
        continue
    fi

    # 自动创建目标目录(如果不存在,-p参数支持递归创建父目录)
    if [[ ! -d "$dest_dir" ]]; then
        if ! mkdir -p "$dest_dir"; then
            echo "❌ 错误:无法创建目标目录 $dest_dir,跳过该行处理"
            continue
        fi
    fi

    # 第三步:执行文件操作(二选一)
    # 选项1:复制文件到目标目录(适合同一个源文件需要迁移到多个目录的场景)
    if cp "$src_file" "$dest_dir/"; then
        echo "✅ 成功:已将 $src_file 复制到 $dest_dir"
    else
        echo "❌ 错误:复制 $src_file 到 $dest_dir 失败"
    fi

    # 选项2:移动文件到目标目录(适合源文件只需要迁移一次的场景)
    # 注意:如果同一个源文件出现在多行,只有第一行会成功,后续行会因源文件已不存在失败
    # if mv "$src_file" "$dest_dir/"; then
    #     echo "✅ 成功:已将 $src_file 移动到 $dest_dir"
    # else
    #     echo "❌ 错误:移动 $src_file 到 $dest_dir 失败"
    # fi

done < "$CONFIG_FILE"

echo "🎉 文件迁移/复制任务全部完成!"

关键细节解释

  • IFS= read -r line || [[ -n "$line" ]]:这是读取文件的黄金组合!IFS=保留行开头的空白字符,-r禁止反斜杠转义,确保读取的内容完全和配置文件一致;|| [[ -n "$line" ]]则处理了文件最后一行没有换行符的边界情况,避免遗漏内容。
  • read -r src_file dest_dir <<< "$line":自动按空白(空格/制表符)拆分每行内容,即使字段间有多个空格也能正确识别两个字段。
  • mkdir -p "$dest_dir":递归创建目录,比如目标目录是/home/user/example/subfolder,即使/home/user/example不存在也能一次性创建所有层级。
  • 全流程错误检查:从配置文件存在性、源文件存在性到目录创建、文件操作,每一步都有失败处理,避免脚本中途崩溃,同时给出明确的提示信息。

特殊场景处理

如果你的配置文件中存在带空格的文件名或目录名(比如"My File.txt" "/home/user/My Folder"),可以把拆分逻辑改成用awk按引号分隔:

# 替换原来的read拆分逻辑
src_file=$(echo "$line" | awk -F'"' '{print $2}')
dest_dir=$(echo "$line" | awk -F'"' '{print $4}')

内容的提问来源于stack exchange,提问作者Defcon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:53