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

时间:2018-10-04 07:00:19

标签: linux bash rename

我有几千个文件,命名如下:

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 :(得分:2)

如果您可以掌握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,这意味着 evaluate 替换中的表达式-或者我称其为< em>“计算出的替换量” 。

答案 1 :(得分:1)

如果您的字符串中只有一个数字,那么下面两行代码应该可以帮助您解决问题

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

您可以将其带入变量中并使用mv命令重命名,而不用回显已更改的文件名

答案 2 :(得分:0)

考虑到文件名的升序冲突,我首先想到了颠倒顺序,但是由于数字排序的差异,仍然存在字母(标准)排序冲突的可能性。
然后是两步解决方案:第一步,在文件名中插入转义字符(或文件名中未出现的任何字符),然后在第二步中将其删除。

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

答案 3 :(得分:0)

Mark的perl-rename解决方案看起来不错,但是您应套用50两次以免名称冲突。如果找不到这种重命名的方式,则可以尝试使用我的rene.py(https://rene-file-renamer.sourceforge.io),该命令将被应用(也应用两次)rene *_*_*_* *_*_?_* B/50。 rene会更容易一点,因为它会自动向您显示更改并询问您是否要进行更改,并且如果您改变主意,则可以撤消操作。