Bash - Benennen Sie alle Dateien um, die ein bestimmtes Regex-Muster enthalten

Bash - Benennen Sie alle Dateien um, die ein bestimmtes Regex-Muster enthalten

Ich habe einige Dateien in einem Verzeichnis, die alle entweder die Zeichenfolge „HG-U133A“ oder „HG-U133B“ enthalten. Ich möchte ein Skript schreiben, das alle Dateien im Verzeichnis durchgeht und alle „HG-U133A“-Dateien mit dem Präfix „A_“ und alle „HG-U133B“-Dateien mit dem Präfix „B_“ umbenennt.

Wenn dies also die Dateien in meinem Verzeichnis sind

> grep "HG-U133[AB]" *
fileA.txt: HG-U133A
fileB.txt: HG-U133A
fileC.txt: HG-U133B
fileD.txt: HG-U133A
fileE.txt: HG-U133B

Ich möchte ein Skript schreiben, das diese Dateien umbenennen kann in

> ls
A_fileA.txt
A_fileB.txt
B_fileC.txt
A_fileD.txt
B_fileE.txt

Ich wäre für Hilfe sehr dankbar. Danke

Antwort1

Dies ist eine tragbare Lösung, die nicht in die KategorieBash-Falle Nummer 1.

for file in *; do
  [ -f "$file" ] || continue
  grep -q -- HG-U133A "$file" && { mv -- "$file" "A_$file"; continue; }
  grep -q -- HG-U133B "$file" && mv -- "$file" "B_$file"
done

Anmerkungen:

  • *stimmt nicht mit Dotfiles überein, aber Sie haben es in Ihrem grepAufruf verwendet, daher gehe ich davon aus, dass das Verhalten auf Sie zutrifft oder Sie wissen, wie Sie es ändern können.
  • *stimmt mit Verzeichnissen überein. Ihr grepSkript wurde ohne Optionen aufgerufen, die es dazu bringen könnten, Verzeichnisse zu verarbeiten. Das Skript überspringt alles, was keine reguläre Datei ist, und der Hauptzweck besteht darin, Verzeichnisse zu überspringen und sich nicht die Mühe zu machen, es grepfür sie auszuführen (was sowieso fehlschlagen würde).
  • Der Doppelstrich ( --) wird hier erklärt:Was bedeutet --(Doppelstrich)? (auch bekannt als „nackter Doppelstrich“)?Dies ist der Fall, wenn einer der Dateinamen mit einem Bindestrich beginnt. Wenn wir ./*stattdessen verwenden würden, *bräuchten wir es nicht.
  • Du hast gesagt „entweder … oder …“, ich interpretiere das als „für eine gegebene Datei wird höchstens ein String passen“. Also continuenach dem ersten . Es ist da, um den zweiten nicht vergeblich grepaufzurufen .grep
  • Wenn Sie viele Dateien mit HG-U133Bund nur wenige mit erwarten, HG-U133Asollten Sie zunächst einen Test für durchführen HG-U133B.

Vorteile:

  • Portabilität,
  • Robustheit (der Code sollte unabhängig von den Dateinamen gut funktionieren).

Nachteil:

  • Das Erzeugen von mindestens einem grepProzess pro regulärer Datei ist alles andere als optimal. Dies kann die Arbeit verlangsamen, wenn mehr als ein paar Dateien zu prüfen sind.

Antwort2

Die folgenden Befehle basherledigen dies:

for file in `grep -l HG-U133A *` ; do mv "$file" "A_$file" ; done
for file in `grep -l HG-U133B *` ; do mv "$file" "B_$file" ; done

verwandte Informationen