复制brain.mgz到父目录加前缀时丢失文件名后缀,如何修复?
问题分析与修正
你的脚本问题出在两个核心点:
cp命令里用到的${dirname_file}是未定义的变量,展开后是空字符串,导致目标文件名变成了${dirname}_,自然丢失了原文件的名称和后缀。- 你没有提取原文件的完整名称(也就是
brain.mgz),没法把它拼到前缀后面实现需求的命名格式。
修正后的脚本
find . -type f -name 'brain.mgz' -exec sh -c ' for file; do # 获取当前文件所在的mri目录路径(例:./fs/sub-001/mri) mri_dir=${file%/*} # 获取目标父目录(例:./fs/sub-001) parentdir=${mri_dir%/*} # 提取父目录的名称(例:sub-001) dirname=${parentdir##*/} # 提取原文件的完整名称(例:brain.mgz) filename=${file##*/} # 复制文件到目标路径,拼接前缀与原文件名 cp "$file" "$parentdir/${dirname}_${filename}" done ' sh {} +
关键改动说明
- 新增
filename=${file##*/}提取原文件名,确保原文件的名称和后缀被完整保留。 - 将
cp命令里的错误变量替换为${dirname}_${filename},直接生成sub-001_brain.mgz这种符合需求的命名格式。
内容的提问来源于stack exchange,提问作者Alex Winston
相关产品推荐
相关产品推荐

