Заменить кратчайшее совпадение шаблона в имени файла - PullRequest
1 голос
/ 06 августа 2020

У меня есть файлы со следующим шаблоном имени файла:

C14_1_S1_R1_001_copy1.fastq.gz

который я хотел бы переименовать таким образом:

C14_1_S1_R1.fastq.gz

Я безуспешно тестировал следующую стратегию замены шаблона:

for f in *.fastq.gz; do echo mv "$f" "${f/_*./_}"; done

Любые предложения приветствуются.

Ответы [ 3 ]

4 голосов
/ 06 августа 2020

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

 mv "$f" "${f%_*_*}.fastq.gz"

Рассмотрим каталог с этими файлами:

$ ls -1
C14_1_S1_R1_001_copy1.fastq.gz
C15_1_S1_R1_001_copy1.fastq.gz

Если мы запустим наш l oop, а затем запустим новый ls, мы увидим измененные имена файлов:

$ for f in ./*.fastq.gz; do mv "$f" "${f%_*_*}.fastq.gz"; done
$ ls -1
C14_1_S1_R1.fastq.gz
C15_1_S1_R1.fastq.gz

Ключ здесь в том, что ${var%word} - это удаление суффикса , и он соответствует самому короткому возможному суффиксу, который соответствует глобусу word . Таким образом, ${f%_*_*} удаляет предпоследний символ подчеркивания и все, что после него. ${f%_*_*}.fastq.gz удаляет предпоследний символ подчеркивания и все после него, а затем восстанавливает желаемый суффикс .fastq.gz.

1 голос
/ 06 августа 2020
str="C14_1_S1_R1_001_copy1.fastq.gz"

front=$(echo "${str}" | cut -d'_' -f1-4)
back=$(echo "${str}" | cut --complement -d'.' -f1)
echo "${front}.${back}"
1 голос
/ 06 августа 2020

С регулярным выражением с использованием оператора проверки =~ и BASH_REMATCH

#!/usr/bin/env bash

for file in *.fastq.gz; do
  if [[ $file =~ ^(.+)(_[[:digit:]]+_copy.*[^\.])(\.fastq\.gz)$ ]]; then
    echo mv -v "$file" "${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
  fi
done

По сути, он просто разделяет C14_1_S1_R1_001_copy1.fastq.gz на три части.

  • BASH_REMATCH[1] имеет C14_1_S1_R1

  • BASH_REMATCH[2] имеет _001_copy1

  • BASH_REMATCH[3] имеет .fastq.gz

  • Удалите echo, если вас устраивает вывод, чтобы файлы можно переименовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...