Как переименовать файлы в bash, чтобы увеличить число в имени? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть несколько тысяч файлов, названных следующим образом:

Cyprinus_carpio_600_nanopore_trim_reads.fasta                
Cyprinus_carpio_700_nanopore_trim_reads.fasta               
Cyprinus_carpio_800_nanopore_trim_reads.fasta                
Cyprinus_carpio_900_nanopore_trim_reads.fasta 
Vibrio_cholerae_3900_nanopore_trim_reads.fasta

для 80 вариаций первых двух слов (80 различных видов), я хотел бы переименовать все эти файлы так, чтобы число былоувеличится на 100 - например:

Vibrio_cholerae_3900_nanopore_trim_reads.fasta 

станет

Vibrio_cholerae_4000_nanopore_trim_reads.fasta

или

Cyprinus_carpio_300_nanopore_trim_reads.fasta

станет

Cyprinus_carpio_400_nanopore_trim_reads.fasta

К сожалению, яЯ не могу понять, как их переименовать, мне повезло, когда я следовал решениям на https://unix.stackexchange.com/questions/40523/rename-files-by-incrementing-a-number-within-the-filename

Но я не могу заставить его работать внутри имени, яработает на Ubuntu 18.04, если это поможет

Ответы [ 4 ]

0 голосов
/ 24 февраля 2019

Решение перл-переименования Марка выглядит великолепно, но вы должны применить его дважды с ударом 50, чтобы избежать конфликта имен.Если вы не можете найти этот вариант переименования, вы можете попробовать мой rene.py (https://rene -file-renamer.sourceforge.io ), для которого будет применяться команда (также применяется дважды) rene *_*_*_* *_*_?_* B/50,Рене будет немного легче, потому что он автоматически показывает вам изменения и спрашивает, хотите ли вы их сделать, и отменяет их, если вы передумаете.

0 голосов
/ 04 октября 2018

Если вы можете заполучить версию rename со вкусом Perl, это просто так:

rename -n 's/(\d+)/$1 + 100/e' *fasta

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

'Ciprianus_maximus_11_fred.fasta' would be renamed to 'Ciprianus_maximus_111_fred.fasta'
'Ciprianus_maximus_300_fred.fasta' would be renamed to 'Ciprianus_maximus_400_fred.fasta'
'Ciprianus_maximus_3900_fred.fasta' would be renamed to 'Ciprianus_maximus_4000_fred.fasta'

Если вы не можете прочитать Perl, это говорит ... "Сделайте одну подстановку следующим образом. Где бы вы ни увидели кучу цифр рядом друг с другом в строке (\d+), запомните их (потому что япоместите это в скобки), а затем замените их оцененным выражением этой группы цифр ($1) плюс 100. ".

Удалите -n, если пробный прогон выглядит правильно,Единственная «сложная часть» - это использование e в конце подстановки, что означает вычисление выражения в подстановке - или я называю это "вычисленнымзамена ".

0 голосов
/ 04 октября 2018

Рассматривая конфликты имен файлов в возрастающем порядке, я сначала подумал об обратном порядке, но все еще остается возможность конфликтов в алфавитном (стандартном) порядке из-за разницы в числовом порядке.
Тогда как насчетдвухэтапное решение: на 1-м шаге в имя файла вставляется escape-символ (или любой другой символ, который не указан в имени файла) и удаляется на 2-м шаге.

#!/bin/bash

esc=$'\033' # ESC character

# 1st pass: increase the number by 100 and insert a ESC before it
for f in *.fasta; do
    num=${f//[^0-9]/}
    num2=$((num + 100))
    f2=${f/$num/$esc$num2}
    mv "$f" "$f2"
done

# 2nd pass: remove the ESC from the filename
for f in *.fasta; do
    f2=${f/$esc/}
    mv "$f" "$f2"
done
0 голосов
/ 04 октября 2018

Если в вашей строке только одно число, то две строчки кода должны помочь вам решить вашу проблему

filename="Vibrio_cholerae_3900_nanopore_trim_reads.fasta"
var=$(echo $filename | grep -oP '\d+')
echo ${filename/${var}/$((var+100))}

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

...