Переименование нескольких файлов с переменными расширениями для удаления начала и конца имени файла

У меня есть несколько файлов, которые мне нужно переименовать, как показано ниже:

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

Но мне нужно иметь возможность распознавать строчные и прописные буквы (без учета регистра) на входе.

2
задан 12 June 2020 в 17:37

2 ответа

Возможно, вы ищете resize2fs , который, несмотря на свое имя, работает и на файловых системах ext4. Опция -M уменьшает файловую систему до минимального размера. В следующей строке я обрезал Стинг максимальной длиной до 6. Я пишу расширение с помощью remogin части smales, которая соответствует *. .

Затем мы перемещаем файл в $ {name}. $ {Extension} .

Надеюсь, что это хорошо работает.

1
ответ дан 19 June 2020 в 21:26

С переименованием на основе 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 когда вы счастливы, что поступаете правильно.

1
ответ дан 19 June 2020 в 21:26

Другие вопросы по тегам:

Похожие вопросы: