Какой код bash позволяет удалить различные символы в имени файла до определенной точки?

Какой код bash позволяет удалить различные символы в имени файла до определенной точки?

У меня есть набор файлов, которые различаются по символам. Например:

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

Я хотел бы удалить все символы до точки S514и S238, сохранив все, что идет после. Возможно ли это сделать, когда файлы имеют разные номера, как показано в моем примере?

Всего около 1100 файлов, поэтому выполнение этой задачи вручную займет довольно много времени.

Самое близкое, что мне удалось сделать, это:

rename 's/IDNR19_//g' *.fastq

удалить часть IDNR19_, но это не решает мою проблему.

решение1

Предполагая, что это имена файлов на диске, которые вы хотите переименовать, а не строки, хранящиеся в переменной или в текстовом файле. Вы можете использовать простой цикл оболочки:

for name in *.fastq; do
    newname=${name#*_*_*_}
    printf 'Would move "%s" to "%s"\n' "$name" "$newname"
    # mv -i -- "$name" "$newname"
done

Это цикл по всем именам, которые соответствуют шаблону *.fastqв текущем каталоге (вы можете быть более конкретными с этим шаблоном, например, изменив его на IDNR*.fastq). Для каждого имени файла он создает новое имя, удаляя префикс, который соответствует шаблону подстановки имени файла *_*_*_. Это делается с помощьюстандартное расширение параметра.

Для безопасности mvзакомментирован. Вам следует запустить код один раз, чтобы убедиться, что он работает правильно, прежде чем включать mv.

Используя одну из различных renameутилит (основанную на модуле Perl File::Rename; существует множество других, см. "Что со всеми этими переименованиями: prename, rename, file-rename?"):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

или короче,

rename -n -v 's/(.*?_){3}//' -- *.fastq

Это более или менее делает то же самое, что и код оболочки выше, но с использованием замены Perl. Замена удаляет начальные биты строки имени файла, сопоставляя три подстроки между подчеркиваниями, используя нежадное сопоставление .*. Удалите -nопцию, когда вы уверены, что она делает правильно.

Связанный контент