如何修改Bash脚本实现双模式PDB文件查找、重命名及复制
带条件逻辑的PDB文件批量处理脚本
以下是满足需求的完整Bash脚本,实现"优先复制指定前缀的PDB文件,未找到则处理指定后缀文件并重命名复制"的逻辑:
#!/bin/bash # 配置参数 mask1='MD_' # 目标文件名前缀 mask2='_after_equil' # 需要移除的后缀(位于pdb扩展名前) dir="./source_dir" # 源文件目录,请根据实际路径修改 target_dir="./target_dir" # 目标目录,请根据实际路径修改 # 确保目标目录存在,不存在则自动创建 mkdir -p "$target_dir" # 统计源目录下符合mask1前缀的PDB文件数量 count_mask1=$(find "$dir" -maxdepth 2 -name "${mask1}*.pdb" | wc -l) if [ "$count_mask1" -gt 0 ]; then # 找到目标文件,直接批量复制 find "$dir" -maxdepth 2 -name "${mask1}*.pdb" -exec cp {} "$target_dir" \; echo "操作完成:已复制所有以${mask1}开头的PDB文件至${target_dir}" else # 未找到mask1前缀文件,处理含mask2的文件 # 使用print0和read -d ''处理含空格/特殊字符的文件名,避免出错 find "$dir" -maxdepth 2 -name "*${mask2}.pdb" -print0 | while IFS= read -r -d '' file_path; do # 提取文件名(不含路径) original_name=$(basename "$file_path") # 执行重命名逻辑:移除mask2,添加mask1前缀 new_name="${mask1}${original_name//${mask2}/}" # 复制并重命名到目标目录 cp "$file_path" "${target_dir}/${new_name}" done echo "操作完成:未找到以${mask1}开头的PDB文件,已处理含${mask2}的文件并重命名复制至${target_dir}" fi
关键逻辑说明
- 目录预检查:用
mkdir -p确保目标目录存在,避免复制时因目录不存在报错 - 条件判断:通过
wc -l统计符合前缀的文件数量,以此触发不同处理分支 - 安全文件名处理:使用
find -print0和read -d ''组合,兼容带空格或特殊字符的文件名 - 重命名规则:利用Bash字符串替换
${var//pattern/replacement}移除指定后缀,再拼接目标前缀
示例效果
源目录待处理文件:
1rep_6nax_apo_300K_after_equil.pdb 3rep_6nax_apo_300K_after_equil.pdb 2rep_6nax_apo_300K_after_equil.pdb 4rep_6nax_apo_300K_after_equil.pdb
处理后目标目录文件:
MD_1rep_6nax_apo_300K.pdb MD_3rep_6nax_apo_300K.pdb MD_2rep_6nax_apo_300K.pdb MD_4rep_6nax_apo_300K.pdb
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

