Переименование нескольких файлов с помощью цикла bash - PullRequest
19 голосов
/ 17 января 2012

Мне нужно переименовать 45 файлов, и я не хочу делать это один за другим. Это имена файлов:

chr10.fasta         chr13_random.fasta  chr17.fasta         chr1.fasta          chr22_random.fasta  chr4_random.fasta  chr7_random.fasta  chrX.fasta
chr10_random.fasta  chr14.fasta         chr17_random.fasta  chr1_random.fasta   chr2.fasta          chr5.fasta         chr8.fasta         chrX_random.fasta
chr11.fasta         chr15.fasta         chr18.fasta         chr20.fasta         chr2_random.fasta   chr5_random.fasta  chr8_random.fasta  chrY.fasta
chr11_random.fasta  chr15_random.fasta  chr18_random.fasta  chr21.fasta         chr3.fasta          chr6.fasta         chr9.fasta         
chr12.fasta         chr16.fasta         chr19.fasta         chr21_random.fasta  chr3_random.fasta   chr6_random.fasta  chr9_random.fasta
chr13.fasta         chr16_random.fasta  chr19_random.fasta  chr22.fasta         chr4.fasta          chr7.fasta         chrM.fasta

Мне нужно изменить расширение ".fasta" на ".fa". Я пытаюсь написать bash-скрипт для этого:

for i in $(ls chr*)

do

NEWNAME = `echo $i | sed 's/sta//g'`

mv $i $NEWNAME

done

Но это не работает. Можете ли вы сказать мне, почему, или дать другое быстрое решение?

Спасибо!

Ответы [ 3 ]

27 голосов
/ 17 января 2012

Несколько ошибок здесь:

  • NEWNAME = должно быть без пробела.Здесь bash ищет команду с именем NEWNAME, но она не выполняется.
  • вы анализируете вывод ls.это плохо, если у вас были файлы с пробелами.Bash может создать список файлов с помощью оператора glob *.
  • . Вы не можете экранировать "$i" и "$NEWNAME".Если любой из них содержит пробел, он делает два аргумента для mv.
  • Если имя файла начинается с тире mv будет считать, что это переключатель.Используйте --, чтобы остановить обработку аргументов.

Попробуйте:

for i in chr*
do
  mv -- "$i" "${i/%.fasta/.fa}"
done

или

for i in chr*
do
  NEWNAME="${i/%.fasta/.fa}"
  mv -- "$i" "$NEWNAME"
done

* "%{var/%pat/replacement} "ищет pat только в конце переменной и заменяет ее на replacement.

9 голосов
/ 17 января 2012
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
7 голосов
/ 17 января 2012

Если у вас есть команда rename, вы можете сделать:

rename .fasta .fa chr*.fasta
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...