Bash Shell读取配置文件生成键值对并实现文件迁移
嘿,我来帮你把这个文件迁移的Shell脚本捋明白!针对你的custom_target.config配置文件,我整理了一套稳健且高效的实现方案,既解决行拆分的问题,也兼顾了错误处理和灵活性。
最优文件迁移Shell脚本方案
核心思路
- 安全读取配置文件的每一行(包括末尾无换行的情况)
- 跳过空行和注释行,让配置文件更易维护
- 精准拆分每行的源文件名和目标目录
- 前置检查:确认源文件存在、自动创建目标目录(含父目录)
- 执行迁移/复制操作,并给出清晰的成功/失败提示
完整脚本示例
#!/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
相关产品推荐
相关产品推荐

