Shell 使用重命名替换文件名

Shell 使用重命名替换文件名,shell,sed,rename,Shell,Sed,Rename,我想重命名文件名,将所有以“u”开头的字符替换为8个大写字母,并只保留扩展名 4585_10_148_H2A119Ub_GTCTGTCA_S51_mcdf_mdup_ngsFlt.fm 4585_10_148_H3K27me3_TCTTCACA_S51_mcdf_mdup_ngsFlt.fm 4585_27_128_Bap1_Bethyl_ACAGATTC_S61_mcdf_mdup_ngsFlt.fw 4585_32_148_1_INPUT_previous_AGAGTCAA_S72_mcdf

我想重命名文件名,将所有以“u”开头的字符替换为8个大写字母,并只保留扩展名

4585_10_148_H2A119Ub_GTCTGTCA_S51_mcdf_mdup_ngsFlt.fm
4585_10_148_H3K27me3_TCTTCACA_S51_mcdf_mdup_ngsFlt.fm
4585_27_128_Bap1_Bethyl_ACAGATTC_S61_mcdf_mdup_ngsFlt.fw
4585_32_148_1_INPUT_previous_AGAGTCAA_S72_mcdf_mdup_ngsFlt.bw
预期产量

4585_10_148_H2A119Ub.fm
4585_10_148_H3K27me3.fm
4585_27_128_Bap1_Bethyl.fm
4585_32_148_1_INPUT_previous.fm
你可以试试这个

for i in *.fm; do mv $i $(echo $i | sed 's/_GTCTGTCA_S51_mcdf_mdup_ngsFlt//g'); done;
for i in *.fm; do mv $i $(echo $i | sed 's/_TCTTCACA_S51_mcdf_mdup_ngsFlt//g'); done;
试试这个:

for f in *; do
    target=$(echo "${f}" | sed -E 's/_[[:upper:]]{8}.*\././')
    mv "${f}" "${target}"
done

关键是
sed
-E
参数,因为它支持扩展正则表达式。

您也可以使用
重命名
(也称
prename
Perl重命名
)如下:

rename --dry-run 's|_[[:upper:]]{8}.*\.|.|' *
样本输出

'4585_10_148_H2A119Ub_GTCTGTCA_S51_mcdf_mdup_ngsFlt.fm' would be renamed to '4585_10_148_H2A119Ub.fm'
'4585_32_148_1_INPUT_previous_AGAGTCAA_S72_mcdf_mdup_ngsFlt.bw' would be renamed to '4585_32_148_1_INPUT_previous.bw'
移除
--干运行
,如果输出看起来不错,则重新运行

这有几个额外的好处:

  • 如果两个文件重命名为同一事物,它将发出警告并避免任何冲突
  • 它可以跨目录重命名,在途中创建任何必要的中间目录
  • 你可以先做一次试运行来测试它
  • 您可以使用任意复杂的Perl代码来指定新名称

在Mac电脑上,使用自制安装,使用:

brew install rename

我想知道我是否可以使用正则表达式。我有n个具有相同模式的文件。此for循环适用于任意数量的
$I
(文件)刚刚注意到我的终端出现复制/粘贴错误(忘记了
sed
命令的
echo
)。如果您尝试了此操作,但什么都没有发生,这就是原因。文件重命名为4585_10_148_H2A119Ub_GTCTGTCA.fm,而不是4585_10_148_H2A119Ub.fm这对我有效:对于f,单位为$(ls);do target=$(echo“${f}”| sed-r's/([u[:upper:]{8})[^.]*/'))#在检查完输出echo mv“${f}”${target}”后删除echo请不要建议解析ls,这里只需将
$(ls)
替换为
*
即可-有关详细信息,请参阅。。此外,
-E
是启用ERE的更好选择。。只有一些旧版本使用
sed-r
而不是
sed-E
@Sundeep-感谢您的反馈(包含在答案中)。有趣的是,我的系统上没有
-E
中的
man-sed
,但它可以工作(也可以使用
busybox-sed
进行测试)。