使用重命名

时间:2018-03-21 13:39:09

标签: shell sed rename

我想通过替换从" _"开头的所有字符来重命名文件名。接下来是八个大写字母,只保留延期。

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

3 个答案:

答案 0 :(得分:2)

试试这个:

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

关键是-E的{​​{1}}参数,因为它启用了扩展的正则表达式。

答案 1 :(得分:1)

你也可以这样使用rename(a.k.a。prenamePerl rename):

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'

如果输出看起来不错,请删除--dry-run并再次运行。

这有几个额外的好处:

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

在Mac上,使用自制程序安装

brew install rename

答案 2 :(得分:0)

你可以试试这个。

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;