Linux
批量重命名文件名,包括舊文件名的一部分
我有以下文件列表;
11F.fastq.gz 11R.fastq.gz 12F.fastq.gz 12R.fastq.gz
我想將這些文件名重命名為以下內容;
11_S11_L001_R1_001.fastq.gz 11_S11_L001_R2_001.fastq.gz 12_S12_L001_R1_001.fastq.gz 12_S12_L001_R2_001.fastq.gz
我嘗試
reanme
如下rename 's/F.fastq/_S_L001_R1_001.fastq/' *.gz rename 's/R.fastq/_S_L001_R2_001.fastq./' *.gz
但我不太清楚如何在“S”之後添加文件編號(在這種情況下為 11 和 12)。任何指針將不勝感激。
您可以擷取變數部分 (
(...)
) 並使用反向引用 ($1
):rename -n 's/(\d+)F\.fastq/$1_S$1_L001_R1_001.fastq/' *F.fastq.gz rename -n 's/(\d+)R\.fastq/$1_S$1_L001_R2_001.fastq/' *R.fastq.gz
-n
如果您對輸出感到滿意,請刪除。
zsh
有自己的內置批量重命名工具:zmv
可作為自動載入功能使用。autoload -Uz zmv typeset -A map=(F 1 R 2) zmv -n '(<->)([FR])(.fastq.gz)' '${1}_S${1}_L001_R$map[$2]_001$3'
(如果滿意,請刪除
-n
(試執行))。或者使用標量
map=FR
並使用該字元串中字母的索引進行替換:map=FR zmv -n "(<->)([$map])(.fastq.gz)" '${1}_S${1}_L001_R$map[(Ie)$2]_001$3'