Переименование кратных файлов с помощью цикла bash
Мне нужно переименовать 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 script, чтобы сделать это:
for i in $(ls chr*)
do
NEWNAME = `echo $i | sed 's/sta//g'`
mv $i $NEWNAME
done
Но это не сработает. Можете ли вы сказать мне, почему, или дать другое быстрое решение?
Спасибо!
Ответы
Ответ 1
Несколько ошибок здесь:
-
NEWNAME =
должно быть без пробелов. Здесь bash ищет команду с именем NEWNAME
, и это не удается.
- Вы анализируете вывод ls. это плохо, если у вас есть файлы с пробелами. bash может составить себе список файлов с оператором glob
*
.
- Вы не избежите
"$i"
и "$NEWNAME"
. Если какое-либо из них содержит пробел, он делает два аргумента для mv.
- Если имя файла начинается с тире
mv
, считается, что это переключатель. Используйте --
, чтобы остановить обработку аргументов.
Try:
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
.
Ответ 2
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
Ответ 3
Если у вас есть команда rename
, вы можете сделать:
rename .fasta .fa chr*.fasta