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 Ihremgrep
Aufruf 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. Ihrgrep
Skript 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, esgrep
fü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
continue
nach dem ersten . Es ist da, um den zweiten nicht vergeblichgrep
aufzurufen .grep
- Wenn Sie viele Dateien mit
HG-U133B
und nur wenige mit erwarten,HG-U133A
sollten Sie zunächst einen Test für durchführenHG-U133B
.
Vorteile:
- Portabilität,
- Robustheit (der Code sollte unabhängig von den Dateinamen gut funktionieren).
Nachteil:
- Das Erzeugen von mindestens einem
grep
Prozess 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 bash
erledigen 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