Ich habe eine Reihe von Dateien mit unterschiedlichen Zeichen. Zum Beispiel:
IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq
Ich möchte alle Zeichen bis zu S514
und entfernen S238
und alles, was danach kommt, behalten. Ist das möglich, wenn die Dateien unterschiedliche Nummern haben, wie in meinem Beispiel gezeigt?
Es gibt ungefähr 1.100 Dateien, daher wäre es ziemlich zeitaufwändig, dies manuell zu tun.
Das Beste, was ich erreichen konnte, ist:
rename 's/IDNR19_//g' *.fastq
um den IDNR19_-Teil zu entfernen, aber das löst mein Problem nicht.
Antwort1
Vorausgesetzt, es handelt sich um die Namen von Dateien auf der Festplatte, die Sie umbenennen möchten, und nicht um in einer Variablen oder einer Textdatei gespeicherte Zeichenfolgen, können Sie eine einfache Shell-Schleife verwenden:
for name in *.fastq; do
newname=${name#*_*_*_}
printf 'Would move "%s" to "%s"\n' "$name" "$newname"
# mv -i -- "$name" "$newname"
done
Dies durchläuft alle Namen, die dem Muster *.fastq
im aktuellen Verzeichnis entsprechen (Sie können dieses Muster genauer definieren, indem Sie es z. B. in ändern IDNR*.fastq
). Für jeden Dateinamen wird ein neuer Name erstellt, indem das Präfix entfernt wird, das dem Muster für das Globbing von Dateinamen entspricht *_*_*_
. Dies geschieht miteine Standard-Parametererweiterung.
Aus Sicherheitsgründen mv
ist das auskommentiert. Sie sollten den Code einmal ausführen, um zu prüfen, ob er das Richtige tut, bevor Sie das aktivieren mv
.
Mithilfe eines der verschiedenen rename
Dienstprogramme (das auf dem Perl- File::Rename
Modul basierende; es gibt eine Reihe verschiedener, siehe "Was ist mit all den Umbenennungen: Vorbenennung, Umbenennung, Dateiumbenennung?"):
rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq
oder kürzer,
rename -n -v 's/(.*?_){3}//' -- *.fastq
Dies bewirkt mehr oder weniger dasselbe wie der Shell-Code oben, verwendet jedoch eine Perl-Ersetzung. Die Ersetzung entfernt die Anfangsbits der Dateinamenzeichenfolge, indem die drei Teilzeichenfolgen zwischen den Unterstrichen mithilfe einer nicht gierigen .*
Übereinstimmung abgeglichen werden. Entfernen Sie die -n
Option, wenn Sie sicher sind, dass sie das Richtige bewirkt.