У меня есть несколько файлов, которые мне нужно переименовать, как показано ниже:
5891_1_0_AD3884_ACTCTCGA_S10.bam
5891_1_0_AD3884_ACTCTCGA_S10.bam.bai
5891_1_AD3875_GAGCTTGT_S1.bam
5891_1_AD3875_GAGCTTGT_S1.bam.bai
5891_2_AD3876_ACACGGTT_S2_R1.bam
5891_2_AD3876_ACACGGTT_S2_R2.bam.bai
Я хотел бы удалить все, кроме AD ****, чтобы получающиеся имена файлов были:
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai
Количество подчеркиваний ("_ ") до и после нашей эры **** не всегда соответствует. В настоящее время всегда следуют 4 цифры после AD, но в будущем оно может увеличиться до 5.
В идеале было бы неплохо использовать bash от расширения параметров (работа в среде Linux Ubuntu), хотя я пробовал это безуспешно. Возможны также решения sed, awk, grep или, наконец, переименования, хотя я пробовал многие из них, но безуспешно. Любая помощь будет принята с благодарностью.
Решение по переименованию из @steeldriver работает отлично.
Мне удалось заставить решение из @Boba Fit работать со следующими модификациями:
for file in *
do
fn=AD"${file#*AD}"
ext=${file#*.}
mv $file rename/${fn%%_*}.${ext}
done
Еще одна проблема заключается в том, что AD также может быть в нижнем регистре (объявление). Например:
5891_1_0_ad3884_ACTCTCGA_S10.bam
5891_1_0_ad3884_ACTCTCGA_S10.bam.bai
5891_1_AD3875_GAGCTTGT_S1.bam
5891_1_AD3875_GAGCTTGT_S1.bam.bai
5891_2_AD3876_ACACGGTT_S2_R1.bam
5891_2_AD3876_ACACGGTT_S2_R2.bam.bai
Для окончательного результата все нормально, если они все написаны заглавными буквами (AD):
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai
Но мне нужно иметь возможность распознавать строчные и прописные буквы (без учета регистра) на входе.
Возможно, вы ищете resize2fs
, который, несмотря на свое имя, работает и на файловых системах ext4. Опция -M
уменьшает файловую систему до минимального размера.
В следующей строке я обрезал Стинг максимальной длиной до 6.
Я пишу расширение с помощью remogin части smales, которая соответствует *.
.
Затем мы перемещаем файл в $ {name}. $ {Extension}
.
Надеюсь, что это хорошо работает.
С переименованием на основе Perl
:
$ rename -n 's/.*(AD\d+).*?[.](.*)/$1.$2/' *.ba[im]
rename(5891_1_0_AD3884_ACTCTCGA_S10.bam, AD3884.bam)
rename(5891_1_0_AD3884_ACTCTCGA_S10.bam.bai, AD3884.bam.bai)
rename(5891_1_AD3875_GAGCTTGT_S1.bam, AD3875.bam)
rename(5891_1_AD3875_GAGCTTGT_S1.bam.bai, AD3875.bam.bai)
rename(5891_2_AD3876_ACACGGTT_S2_R1.bam, AD3876.bam)
rename(5891_2_AD3876_ACACGGTT_S2_R2.bam.bai, AD3876.bam.bai)
Удалите -n
когда вы счастливы, что поступаете правильно.