如何重命名多个文件重新排序名称部分并在前面包括排序数字 (bash)

How to rename multiple files reordering name parts and including ordered numbers at the front (bash)

我在基于 (a) 示例名称命名的文件夹中有一个文件列表 [有时对于不同的个人使用“_1”或“_2”]; (b) 工作编号[1-12];和 (c) 染色体数目 [chrI-chrXXI].

例如:

    8116_1_chrI.vcf  #sample[8116]; jobId[1]; chr[chrI]
    8116_1_chrII.vcf  #sample[8116]; jobId[1]; chr[chrII]
    ...
    CSC0832_1_7_chrVIII.vcf  #sample[CSC0832_1]; jobId[7]; chr[chrVIII]
    CSC0832_1_7_chrXIX.vcf  #sample[CSC0832_1]; jobId[7]; chr[chrXIX]
    ...
    RNF2887_2_12_chrX.vcf  #sample[RNF2887_2]; jobId[2]; chr[chrX]
    RNF2887_2_12_chrXI.vcf  #sample[RNF2887_2]; jobId[2]; chr[chrXI]
    ...

每个样本都有相同的job id号,每个染色体都有单独的文件。 我正在尝试提交一个作业数组,所以现在我需要每个文件的唯一标识符(作业 ID),并且我试图通过(1)在前面包含一个唯一编号来重命名它们; (2) 然后添加样本id; (3) 然后是染色体数目。

我正在尝试为此做一个 bash for 循环,但它不起作用。下面是我的脚本:

    for FILENAME in `ls $SCRATCH/stickleback/sorelData/indSamplesVcf/splitChr/*.vcf`; do
    ROOTNAME=`basename ${FILENAME%%_*}`
    CHR=`basename ${FILENAME##*_} .vcf`
    for LIST in `seq 279`; do
    cp "$FILENAME" $SCRATCH/stickleback/sorelData/indSamplesVcf/splitCopy/${LIST}_${ROOTNAME}_${CHR}.vcf
    echo "copying $(basename ${FILENAME}) to ${LIST}_${ROOTNAME}_${CHR}.vcf"
    done
    done

我得到的是一个具有唯一编号的文件,但它们总是相同的样本 ID 和相同的染色体编号:

    1_8116_chrIII.vcf
    2_8116_chrIII.vcf
    ...

我注意到的一件事是,当我 echo basename ${FILENAME##*_} 时,它会按字母顺序列出染色体(因为它们是罗马字母)。这也会影响重命名吗?

很抱歉问了这个冗长而愚蠢的问题,但我是这方面的新手。

谢谢!

如果有帮助...

directory=$SCRATCH/stickleback/sorelData/indSamplesVcf/splitChr

list=0
for filename in $directory/*.vcf ; do
    basename=$( basename ${filename} )  # 8116_1_chrI.vcf
    sample=${basename%%_*}              # 8116
    chr=${basename##*_}                 # chrI.vcf
    list=$(( list+1 ))
    cp "$directory/$filename" "$directory/splitCopy/${list}_${sample}_${chr}"
    echo "copying $basename to ${list}_${sample}_${chr}"
done

我假设:

  • 您要向文件名添加唯一 ID ($list)
  • 文件名变为 id_sample_chr.extension

我建议:

  • 脚本变量小写
  • 更喜欢$( command ),没有反引号
  • 不使用$( ls )
  • 使用缩进