Bash: reemplazar parte del nombre del archivo
Tengo un comando que quiero ejecutar en todos los archivos de una carpeta, y la sintaxis del comando se ve así:
tophat -o <output_file> <input_file>
Lo que me gustaría hacer es un script que recorra todos los archivos en una carpeta arbitraria y también use los nombres de los archivos de entrada para crear nombres de archivo de salida similares pero diferentes. Los nombres de los archivos se ven así:
input name desired output name
path/to/sample1.fastq path/to/sample1.bam
path/to/sample2.fastq path/to/sample2.bam
Hacer que la entrada al trabajo parezca bastante simple:
for f in *.fastq
do
tophat -o <output_file> $f
done
Traté de usaroutput=${f,.fastq,.bam}
y usar eso como parámetro de salida, pero eso no funciona. Todo lo que obtengo es un error:line 3: ${f,.fastq,.bam}: bad substitution
. ¿Es esta la forma de hacer lo que quiero o debería hacer otra cosa? Si es la forma correcta, ¿qué estoy haciendo mal?
[EDITAR]:
¡Gracias por todas las respuestas! Sin embargo, una pregunta adicional ... ¿Qué pasa si tengo archivos con este nombre?
path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...
... donde puedo tener un número arbitrario de muestras (sampleX
), pero todos tienen dos archivos asociados (_1
y_2
) El comando ahora se ve así:
tophat -o <output_file> <input_1> <input_2>
Entonces, todavía hay una sola salida, por la cual podría hacer algo como"${f/_[1-2].fastq/.bam}"
, pero no estoy seguro de cómo obtener un bucle que solo se repite una vez cadasampleX
al mismo tiempo que toma los dos archivos asociados ... ¿Ideas?
[EDITAR # 2]:
Entonces, ¡este es el guión final que hizo el truco!
for f in *_1.fastq
do
tophat -o "${f/_1.fastq/.bam}" $f "${f/_1.fastq/_2.fasq}"
done