如何重命名多个文件重新排序名称部分并在前面包括排序数字 (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 )
- 使用缩进
我在基于 (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 )
- 使用缩进