用循环变量名重命名文件

时间:2019-02-12 01:38:25

标签: bash loops rename

我正在尝试下载一堆文件并在重命名时将其重命名。下载部分可以正常工作,但是我无法重命名文件。这是我正在使用的脚本:

COUNTER=0
for (( i = 696; i <= 773; i++ ))
  do
  fastq-dump --split-3 --accession SRR546$i
mv SRR546"$i"_1 ./"$COUNTER"mVD_SRR546$i_1
mv SRR546"$i"_2 ./"$COUNTER"mVD_SRR546$i_2
gzip *.fastq

COUNTER=$[COUNTER + 1]
done

这将正确下载文件SRR546696,SRR546697等,但不会重命名它们。

我也尝试使用:

rename 's/SRR/"$COUNTER"mVD_SRR/' *.fastq

但这也不起作用。

2 个答案:

答案 0 :(得分:5)

您需要对参数加双引号,以防止单词分裂和乱序。同时,您需要使用{}保留变量名称:

counter=0
for ((i = 696; i <= 773; i++)); do
  fastq-dump --split-3 --accession "SRR546$i"
  mv "SRR546${i}_1" "./${counter}mVD_SRR546${i}_1"
  mv "SRR546${i}_2" "./${counter}mVD_SRR546${i}_2"
  gzip *.fastq
  ((counter++))
done

您可以使用变量来保存该字符串并使代码更具可读性,而不是在很多地方对“ SRR546”进行硬编码:

counter=0 srr="SRR546"
for ((i = 696; i <= 773; i++)); do
  fastq-dump --split-3 --accession "$srr$i"
  mv "$srr${i}_1" "./${counter}mVD_${srr}${i}_1"
  mv "$srr${i}_2" "./${counter}mVD_${srr}${i}_2"
  gzip *.fastq
  ((counter++))
done

改进:

  • 对普通变量使用小写字母(计数器而不是COUNTER)
  • 使用引号防止单词分裂和混乱(尽管这不是问题,因为该变量包含数字,没有空格或其他元字符
  • 使用一组双引号而不是多个单引号
  • 使用++运算符像((counter++)中那样递增计数器,并且((...))$[ ... ]better syntax

您可能想在代码中添加error checking

相关

答案 1 :(得分:0)

将变量名与字符串结合使用时,仅应用字符串加引号:

COUNTER=0
for (( i = 696; i <= 773; i++ )); do

    fastq-dump --split-3 --accession 'SRR546'$i

    mv 'SRR546'$i'_1' ./$COUNTER'mVD_SRR546'$i'_1'
    mv 'SRR546'$i'_2' ./$COUNTER'mVD_SRR546'$i'_2'
    gzip *.fastq

    COUNTER=$[COUNTER + 1]
done