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

时间:2018-04-05 01:38:42

标签: bash batch-rename

我有一个文件夹列表,该文件夹基于(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]
    ...

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

我正在尝试为此循环执行bash,但它无效。以下是我的剧本:

    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##*_}时,它按字母顺序列出染色体(因为它们在罗马人中)。这会影响重命名吗?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

如果它有帮助......

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)
  • filename成为id_sample_chr.extension

我建议:

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