Bash: substituir parte do nome do arquivo
Eu tenho um comando que quero executar em todos os arquivos de uma pasta, e a sintaxe do comando é semelhante a esta:
tophat -o <output_file> <input_file>
O que eu gostaria de fazer é um script que faça um loop em todos os arquivos em uma pasta arbitrária e também use os nomes dos arquivos de entrada para criar nomes de arquivos de saída semelhantes, mas diferentes. Os nomes dos arquivos são assim:
input name desired output name
path/to/sample1.fastq path/to/sample1.bam
path/to/sample2.fastq path/to/sample2.bam
Colocar a entrada para trabalhar parece bastante simples:
for f in *.fastq
do
tophat -o <output_file> $f
done
Eu tentei usaroutput=${f,.fastq,.bam}
e usando isso como parâmetro de saída, mas isso não funciona. Tudo o que recebo é um erro:line 3: ${f,.fastq,.bam}: bad substitution
. É assim que se faz o que eu quero ou devo fazer outra coisa? Se for o caminho correto, o que estou fazendo de errado?
[EDITAR]:
Obrigado por todas as respostas! Uma pergunta bônus, no entanto ... E se eu tiver arquivos nomeados como este, em vez disso:
path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...
... onde eu posso ter um número arbitrário de amostras (sampleX
), mas todos eles têm dois arquivos associados a eles (_1
e_2
) O comando agora se parece com isso:
tophat -o <output_file> <input_1> <input_2>
Então, ainda há apenas uma saída, para a qual eu poderia fazer algo como"${f/_[1-2].fastq/.bam}"
, mas não tenho certeza de como obter um loop que itere apenas uma vez a cadasampleX
ao mesmo tempo em que pega os dois arquivos associados ... Idéias?
[EDIÇÃO # 2]:
Então, este é o script final que fez o truque!
for f in *_1.fastq
do
tophat -o "${f/_1.fastq/.bam}" $f "${f/_1.fastq/_2.fasq}"
done