Переименовать файлы с именем переменной цикла - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь загрузить кучу файлов и переименовать их, как я иду.часть загрузки работает правильно, но я не могу заставить ее переименовать файлы.Это скрипт, который я использую:

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 голосов
/ 12 февраля 2019

Вам необходимо заключить аргументы в двойные кавычки, чтобы не допустить разбиения и разбивки слов.В то же время вам нужно сохранить имена переменных с помощью {}:

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++), а ((...)) имеет лучший синтаксис , чем $[ ... ]

Вы можете добавить проверку ошибок к вашемукод.

Связанные

0 голосов
/ 12 февраля 2019

Когда вы объединяете имя переменной со строкой, должна указываться только строка:

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
...