如何批量将xxx(内容).txt格式文件重命名为括号内内容.txt
批量重命名实现方案
操作前提示:所有命令建议先加
echo试运行,确认新文件名符合预期后再去掉echo执行实际重命名,避免文件丢失或误改。
方法1:使用Perl版rename工具(最简便,主流Linux发行版默认预装)
直接匹配括号内内容生成新文件名,适配需求场景:
# 基础版本:仅提取括号内内容,保留原横杠,适配前两个文件的需求 rename 's/.*\((.*)\)\.txt/$1.txt/' *.txt # 全适配版本:提取括号内容后删除所有横杠,覆盖第三个文件的特殊需求 rename 's/.*\((.*)\)\.txt/$1=~s|-||gr . ".txt"/e' *.txt
命令说明:正则里的\(和\)是转义后的括号,专门匹配文件名里的实际括号,$1取括号内的捕获分组内容。
方法2:纯Bash实现(无需额外工具,兼容性最强)
用原生参数展开处理文件名,完全不需要处理转义问题:
for file in *.txt; do # 提取括号内内容 content="${file#*(}" content="${content%)*}" # 如需删除横杠,取消注释下面这行 # content="${content//-}" mv -- "$file" "${content}.txt" done
方法3:sed + mv 组合实现(适配sed处理思路)
解决括号转义问题的标准写法:
for file in *.txt; do new_name=$(echo "$file" | sed -E 's/.*\((.+)\)\.txt/\1.txt/') # 如需删除横杠,加上管道替换,替换为下行写法 # new_name=$(echo "$file" | sed -E 's/.*\((.+)\)\.txt/\1.txt/' | sed 's/-//g') mv -- "$file" "$new_name" done
这里的-E参数使用扩展正则,括号用反斜杠转义即可匹配实际的括号字符,不会出现转义错误问题。
内容的提问来源于stack exchange,提问作者Jim Howard
相关产品推荐
相关产品推荐

