
У меня есть набор файлов, которые различаются по символам. Например:
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
опцию, когда вы уверены, что она делает правильно.