Bash: Ersetze einen Teil des Dateinamens
Ich habe einen Befehl, den ich für alle Dateien eines Ordners ausführen möchte, und die Syntax des Befehls sieht folgendermaßen aus:
tophat -o <output_file> <input_file>
Was ich tun möchte, ist ein Skript, das alle Dateien in einem beliebigen Ordner durchläuft und auch die Eingabedateinamen verwendet, um ähnliche, aber unterschiedliche Ausgabedateinamen zu erstellen. Der Dateiname sieht folgendermaßen aus:
input name desired output name
path/to/sample1.fastq path/to/sample1.bam
path/to/sample2.fastq path/to/sample2.bam
Die Eingabe zum Funktionieren zu bringen, scheint einfach zu sein:
for f in *.fastq
do
tophat -o <output_file> $f
done
Ich habe versucht mitoutput=${f,.fastq,.bam}
und das als Ausgabeparameter verwenden, aber das funktioniert nicht. Alles was ich bekomme ist ein Fehler:line 3: ${f,.fastq,.bam}: bad substitution
. Ist dies der Weg, um zu tun, was ich will, oder sollte ich etwas anderes tun? Wenn es der richtige Weg ist, was mache ich dann falsch?
[BEARBEITEN]
ielen Dank für alle Antworten! Eine Bonusfrage, aber ... Was ist, wenn ich Dateien mit dem folgenden Namen habe:
path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...
... wo ich beliebig viele Samples haben kann sampleX
), aber allen sind zwei Dateien zugeordnet _1
und_2
). Der Befehl sieht jetzt so aus:
tophat -o <output_file> <input_1> <input_2>
So, es gibt immer noch nur den einen Ausgang, für den ich so etwas wie @ machen könn"${f/_[1-2].fastq/.bam}"
, aber ich bin nicht sicher, wie man eine Schleife erhält, die nur einmal über jedes @ iteriesampleX
gleichzeitig mit den beiden zugehörigen Dateien ... Ideen?
[EDIT # 2]:
So, das ist das letzte Skript, das den Trick gemacht hat!
for f in *_1.fastq
do
tophat -o "${f/_1.fastq/.bam}" $f "${f/_1.fastq/_2.fasq}"
done