Bash: заменить часть имени файла
У меня есть команда, которую я хочу выполнить для всех файлов в папке, и синтаксис команды выглядит следующим образом:
tophat -o <output_file> <input_file>
Что я хотел бы сделать, так это сценарий, который перебирает все файлы в произвольной папке, а также использует имена входных файлов для создания похожих, но разных имен выходных файлов. Имена файлов выглядят так:
input name desired output name
path/to/sample1.fastq path/to/sample1.bam
path/to/sample2.fastq path/to/sample2.bam
Получение ввода для работы кажется достаточно простым:
for f in *.fastq
do
tophat -o <output_file> $f
done
Я пытался с помощьюoutput=${f,.fastq,.bam}
и используя это в качестве выходного параметра, но это не работает. Все, что я получаю, это ошибка:line 3: ${f,.fastq,.bam}: bad substitution
, Это способ делать то, что я хочу, или я должен делать что-то еще? Если это правильный путь, что я делаю не так?
[РЕДАКТИРОВАТЬ]:
Спасибо за ответы на все вопросы! Бонусный вопрос, однако ... Что делать, если у меня есть файлы с такими именами:
path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...
... где я могу иметь произвольное количество образцов (sampleX
), но все они имеют два файла, связанных с ними (_1
а также_2
). Команда теперь выглядит так:
tophat -o <output_file> <input_1> <input_2>
Итак, есть только один выход, для которого я мог бы сделать что-то вроде"${f/_[1-2].fastq/.bam}"
, но я не уверен, как получить цикл, который повторяется только один раз за каждыйsampleX
одновременно принимая оба связанных файла ... Идеи?
[РЕДАКТИРОВАТЬ # 2]:
Итак, это последний сценарий, который сделал свое дело!
for f in *_1.fastq
do
tophat -o "${f/_1.fastq/.bam}" $f "${f/_1.fastq/_2.fasq}"
done