Shell 使用重命名替换文件名
我想重命名文件名,将所有以“u”开头的字符替换为8个大写字母,并只保留扩展名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
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
进行测试)。