簡體   English   中英

如何重命名bash中的文件以增加名稱?

[英]How to rename files in bash to increase number in name?

我有幾千個文件,名稱如下:

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上的解決方案感到幸運在文件名內

但是我不能在名稱中使用它,如果可以,我正在Ubuntu 18.04上運行

如果你能得到的Perl的口味版本保持rename ,這是簡單的是這樣的:

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 ,這意味着評估替換中的表達式-或我稱其為“計算的替換”

如果您的字符串中只有一個數字,則下面兩行代碼應該可以幫助您解決問題

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

您可以將其放入變量中,然后使用mv命令重命名,而不必回顯更改的文件名。

考慮到文件名的升序沖突,我首先想到了顛倒順序,但是由於數字排序的差異,仍然存在字母(標准)排序沖突的可能性。
然后是兩步解決方案:在第一步中,將轉義字符(或文件名中未出現的任何字符)插入文件名中,並在第二步中將其刪除。

#!/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

Mark的perl-rename解決方案看起來不錯,但您應套用兩次,每次顛倒50,以避免名稱沖突。 如果找不到這種重命名風格,則可以嘗試使用我的rene.py( https://rene-file-renamer.sourceforge.io ),對其使用命令(也要兩次) rene *_*_*_* *_*_?_* B/50 rene會更容易一些,因為它會自動向您顯示更改並詢問您是否要進行更改,並且如果您改變主意,則可以撤消操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM