Windows下Bash脚本路径变量拼接失效,文件重命名问题求助
Bash脚本重命名复制文件失败问题
我编写了一段Bash脚本,意图将源目录下多个子文件夹中的文件复制到目标目录,并将文件重命名为包含原文件夹名称的格式,运行环境为Windows。脚本代码如下:
#!/bin/bash source_path="c:/Data/Raw/threeObj_test/copy_us" target_path="c:/Users/installer/Desktop/Val/tmp/" echo "Coping data from " $source_path " to " $target_path for curr_dir in $source_path/*/ do curr_subject= basename "$curr_dir" curr_source_dir=$curr_dir"Media Files" for file in "$curr_source_dir"/* do file_name= basename "$file" new_copy_name="${target_path}${curr_subject}${file_name}" echo "$new_copy_name" cp "$file" "$new_copy_name" done done echo "Done copying files"
运行该脚本后,文件确实被复制,但未按预期完成重命名,new_copy_name的变量拼接似乎失效。我也尝试过new_copy_name="$target_path$curr_subject$file_name"的写法,但问题依旧。请问我在变量拼接的理解上存在什么误区?
问题根源:变量赋值与命令替换的错误用法
你遇到的问题不是变量拼接的语法错误,而是变量赋值时的两个关键错误:
赋值语句不能有空格:在Bash中,变量赋值时
=左右不能有空格,你写的curr_subject= basename "$curr_dir"会被解析为:执行basename "$curr_dir"命令,同时临时设置环境变量curr_subject=(空值)。正确的写法应该是用命令替换将命令输出赋值给变量。缺失命令替换语法:要获取
basename命令的输出并赋值给变量,必须使用$(command)或者反引号`command`(推荐用$(),可读性更好)包裹命令。你之前的写法没有做命令替换,导致curr_subject和file_name都没有被正确赋值为对应目录/文件名,最终拼接出来的new_copy_name里这两个变量是空的,自然无法完成预期的重命名。
修正后的脚本
将两个变量赋值的行修改后,脚本就能正常工作:
#!/bin/bash source_path="c:/Data/Raw/threeObj_test/copy_us" target_path="c:/Users/installer/Desktop/Val/tmp/" echo "Copying data from $source_path to $target_path" for curr_dir in "$source_path"/*/ do curr_subject=$(basename "$curr_dir") curr_source_dir="${curr_dir}Media Files" for file in "$curr_source_dir"/* do file_name=$(basename "$file") new_copy_name="${target_path}${curr_subject}_${file_name}" # 可选:添加下划线分隔目录名和文件名,避免名称连在一起不易区分 echo "$new_copy_name" cp "$file" "$new_copy_name" done done echo "Done copying files"
额外优化点:
- 把
echo里的变量直接嵌入字符串,语法更简洁; - 给
curr_source_dir的拼接加上大括号,避免歧义; - 建议在
curr_subject和file_name之间加下划线(_),让重命名后的文件名结构更清晰。
内容的提问来源于stack exchange,提问作者user22560166
相关产品推荐
相关产品推荐

