Suchen Sie in einer Datei nach Text und benennen Sie die Datei mit diesem Text um


7

Wir haben eine Reihe von Jobberichten von einem System, die auf unserem Linux-Server mit dem Präfix speichern O*****.TXT. In der Datei befindet sich die Prozess-ID des Berichts.

Welches Skript kann ich ausführen, um alle 'O****.TXTDateien in einem Verzeichnis zu durchsuchen und jede Datei mit der Prozess-ID aus jeder Datei umzubenennen? z.B:

Suchen Sie OAAJWNZN.TXTnach ProcID:0000019324, Umbenennungs OAAJWNZN.TXTzu 0000019324.TXT.

Sobald diese Datei umbenannt wurde, wechselt das Skript zur nächsten Datei im Verzeichnis und führt dasselbe aus.

Antworten:


7

Ein awk-Befehl, der die Datei liest und umbenennt:

awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT

Da ist die ProcIDLinie eigentlich:

JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45

Um das I, P zu extrahieren, müssen wir beide :und teilen ), was uns 0000019324als zweites Feld gibt.

Entfernen echo, um die Verschiebung tatsächlich auszuführen. Verwenden Sie diese Option nur, wenn die Dateinamen ProcIDkeine Leerzeichen oder Sonderzeichen enthalten.

Dieser Befehl ruft das auf, ProcIDindem er aufteilt :, um das zweite Feld abzurufen, und verwendet es dann und die spezielle Variable FILENAME, um den Befehl zu erstellen. Die Dokumentation von GNU awk schlägt die printf ... | "/bin/sh"Methode vor. Dann springen wir zur nächsten Datei.


Hallo. Danke für die Antwort. Die Zeile in der Datei, aus der die ProcID abgerufen wird, lautet wie folgt: JOB 04508907 (ProcID: 0000019324) START AM 22.12.2016 / 09:10:45 Beim Ausführen des vorgeschlagenen Skripts wird Folgendes angezeigt. / bin / sh: Zeile 1: Syntaxfehler in der Nähe eines unerwarteten Tokens )' /bin/sh: line 1: mv OAAJWNZN.TXT 0000019324) START AM 22.12.2016 / 09.txt 'Was muss ich ändern?
IanG

@IanG hat die ProcID-Zeile immer die Form JOB X (ProcID:Y) ...?
Muru

Ja, die Prozess-ID befindet sich immer in dieser Zeile und in diesem Format.
IanG

@IanG einfach ändern -F:zu -F '[:)]'. Ich habe die Antwort aktualisiert.
Muru

Vielen Dank. das funktionierte mit nur einer Datei in einem Verzeichnis. Ich habe jetzt mehrere Dateien zum Verzeichnis hinzugefügt und das Skript ausgeführt, aber wurde ein Fehler zurückgegeben? awk -F '[:)]' '/ ProcID / {printf "mv% s% s.txt", DATEINAME, $ 2 | "/ bin / sh"; nextfile} 'O * .TXT mv: Ziel `0000015947.txt' ist kein Verzeichnis
IanG

6

Sie können verwendet werden for, renameund sedin dem Verzeichnis , in dem die Dateien:

for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done

Entfernen Sie -nnach dem renameTesten, um die Dateien tatsächlich umzubenennen

Erläuterung

  • for i in O*TXT; do Mach etwas mit all den passenden Dateien
  • rename -nMelden Sie einfach die neuen Namen, benennen Sie sie noch nicht um (entfernen Sie sie -nnach dem Testen).
  • "s/old/new/"ersetzen olddurch new(verwenden Sie doppelte anstelle von einfachen Anführungszeichen, damit wir Variablen mit $Erweiterung übergeben können)
  • $(command)Befehlsersetzung - Ausgabe commandan etwas anderes übergeben
  • .*\.TXTstimmen mit allen Zeichen überein, gefolgt von Literal .und dannTXT
  • sedRufen Sie unseren Freund sedan, um die Datei zu lesen und Dinge daraus zu extrahieren
  • -n Drucken Sie nichts aus, bis wir danach fragen
  • -rbenutze ERE, damit wir nicht entkommen müssen ()oder+
  • ( |^) Leerzeichen oder Zeilenanfang
  • ProcID:([0-9]+) mindestens eine Ziffer nach ProcID ... speichern Sie die Nummer für später
  • ( |$) Leerzeichen oder Zeilenende
  • \2 Rückverweis auf Muster, das zuvor mit gespeichert wurde ()
  • p Drucken Sie das Ergebnis nach der Bearbeitung

4
  1. Durchlaufen Sie die Dateien.
  2. Sie können grep verwenden, um die ProcID zu finden
  3. Verschieben Sie die Datei in den neuen Dateinamen

Machen Sie ein cp anstelle von mv, wenn Sie die alten Dateien behalten möchten oder nicht sicher sind.

for file in 0*.TXT; do
  procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
  new_filename="/outputpath/${procid}.TXT";
  if [ ! -f "$newfilename" ]; then
    mv "$file" "$new_filename";
  fi;
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.