Как переименовать несколько файлов с несколькими комбинациями букв и цифр и размеров, используя bash или regex? - PullRequest
1 голос
/ 19 сентября 2019

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

    BEIII_S29_pear_derep.fasta
    BEII_S15_pear_derep.fasta
    BEI_S1_pear_derep.fasta 
    MB211III_S30_pear_derep.fasta
    MB211II_S16_pear_derep.fasta
    MB211I_S2_pear_derep.fasta
    ... 

, и мне нужно переименовать в:

    BEIII.fas
    BEII.fas
    BEI.fas
    MB211III.fas
    MB211II.fas
    MB211I.fas

Я попытался использовать для цикла:

    for i in *_S[0-9]{1,2}_pear_derep.fasta; do newfile="$(basename $i _S[0-9]{1,2}_pear_derep.fasta)"; echo $newfile; cp ${newfile}_S[0-9]{1,2}_pear_derep.fasta ${newfile}.fas; done;

Это не сработало, тогда

    rename 's/([A-Z]*[0-9]*[I]{1,4})_[A-Z][0-9]_[a-z]_[a-z]{1,5}(\.fasta).*/$1$2/g' *

Тогда не сработало

    for file in *.fas; do newfile=$(echo "$file" | sed -re 's/S_[0-9][0-9](\.)/\./g') mv -v $file $newfile; done;

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

    [A-Z]{2}[0-9]{3}[I]{1,3} 

, тогда все остальное исключается

    S[0-9]{1,2}_[a-z]{4}_[a-z]{5} and then the extension .fasta to .fas

Может кто-нибудь помочь мне, пожалуйста?Спасибо, ребята

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Регулярное выражение в вашей попытке rename пропускает кучу квантификаторов.Кроме того, это не меняет расширение с .fasta на .fas.Вы также должны привязать его к началу и концу имени файла.Модификатор g не нужен, так как вы делаете только одну замену для имени.

rename 's/^([A-Z]*[0-9]*I{1,4})_[A-Z][0-9]*_[a-z]*_[a-z]{1,5}\.fasta$/$1.fas/' *
1 голос
/ 19 сентября 2019

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

for i in *\.fasta; do 
    mv $i ${i/_*/}.fas;
done

Подстановка ${i/_*/} удаляет все после первого _.

...