我有以下文件列表:
Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.alleles.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.matches.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.snps.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.tags.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.alleles.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.matches.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.snps.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.tags.tsv
我想消除一些重复的字符串并将文件重命名如下:
A5201_tdim.等位基因.tsv A5201_tdim.matches.tsv A5201_tdim.snps.tsv
我尝试使用:
mv Dorn_Triatomine_*_sequence_1_unmappedforTdim_tdim.tags.tsv *_tdim.tags.tsv
完成此任务的最简单方法是什么?
答案1
这个脚本应该做到这一点:
#!/bin/sh
for f in Dorn_Triatom* ; do
mv "$f" `echo "$f" | sed -e 's/Dorn_Triatomine_//' -e 's/sequence_1_unmappedforTdim_//'`
done
答案2
与 PCRE 一起使用grep
来获取新文件名:
#!/bin/bash
for file in *.tsv; do
newname="$(grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file")$(grep -Po '.*_\K.*$' <<<"$file")"
mv "$file" "$newname"
done
newname
是两个操作的输出的组合grep
:
grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file"
A5201_
将从每个文件名输出类似的字符串$(grep -Po '.*_\K.*$' <<<"$file")
将匹配文件名的最后部分,在最后一个之后_
$()
是bash
命令替换模式。