Wie lautet der Bash-Code, um unterschiedliche Zeichen in einem Dateinamen bis zu einem bestimmten Punkt zu entfernen?

Wie lautet der Bash-Code, um unterschiedliche Zeichen in einem Dateinamen bis zu einem bestimmten Punkt zu entfernen?

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 S514und entfernen S238und 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 *.fastqim 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 mvist 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 renameDienstprogramme (das auf dem Perl- File::RenameModul 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 -nOption, wenn Sie sicher sind, dass sie das Richtige bewirkt.

verwandte Informationen