Массовое переименование имен файлов в Ubuntu / Linux с переменным шаблоном - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь переименовать группу файлов с изменяемым шаблоном, который нужно удалить.

У меня есть:

1B_ACTCGCTA-CCTAGAGT_L001_R1_001.fastq.gz
1B_ACTCGCTA-CCTAGAGT_L001_R2_001.fastq.gz

97C_TAAGGCGA-TTATGCGA_L001_R1_001.fastq.gz
97C_TAAGGCGA-TTATGCGA_L001_R2_001.fastq.gz

98A_S62_L001_R1_001.fastq.gz
98A_S62_L001_R2_001.fastq.gz

и я хочу получить:

1B_R1_001.fastq.gz
1B_R2_001.fastq.gz

97C_R1_001.fastq.gz
97C_R2_001.fastq.gz

98A_R1_001.fastq.gz
98A_R2_001.fastq.gz

Как вы можете видеть, шаблон, который нужно отбросить, является переменным и простое сопоставление не сработает.Логичным обходным решением было бы исключить все, что находится между первым и третьим подчеркиванием или первым подчеркиванием и буквой «R».К сожалению, я не могу придумать код, который бы это сделал.Это может быть что угодно, пока оно работает, переименовывать, использовать bash для цикла и т. Д. ...

Оцените вашу помощь, Deni

РЕДАКТИРОВАТЬ: я пытался использовать цикл for, ноне в состоянии придумать полный код для сохранения второй части имени файла (все, что следует за буквой «R»)

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

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Ответ, который не зависит от количества подчеркиваний:

for file in $(ls); do
    mv $file $(echo $file | awk -F _ 'BEGIN {OFS="_"} {print $1, $(NF-1), $NF}');
done
0 голосов
/ 31 мая 2018

С (Perl) rename:

rename --dry-run 's/_.*_R/_R/' *gz

Пример вывода

'1B_ACTCGCTA-CCTAGAGT_L001_R1_001.fastq.gz' would be renamed to '1B_R1_001.fastq.gz'
'1B_ACTCGCTA-CCTAGAGT_L001_R2_001.fastq.gz' would be renamed to '1B_R2_001.fastq.gz'
'97C_TAAGGCGA-TTATGCGA_L001_R1_001.fastq.gz' would be renamed to '97C_R1_001.fastq.gz'
'97C_TAAGGCGA-TTATGCGA_L001_R2_001.fastq.gz' would be renamed to '97C_R2_001.fastq.gz'
'98A_S62_L001_R1_001.fastq.gz' would be renamed to '98A_R1_001.fastq.gz'
'98A_S62_L001_R2_001.fastq.gz' would be renamed to '98A_R2_001.fastq.gz'
0 голосов
/ 31 мая 2018

Должно работать следующее:

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

Я специально добавил echo перед mv, поэтому он печатает, что он будет перемещать.Если он печатает правильно, удалите echo и запустите снова.

Что здесь происходит, я беру голову через %%, а хвост через # и объединяю их.См. Parameter Expansion в man bash для значения %% и #.Решение основано на том, что число _ в именах файлов является постоянным.

...