Nachhilfe in regex

Post Reply
Message
Author
der_micbur

Nachhilfe in regex

#1 Post by der_micbur »

Hallo,

ich brauche eine kurze Nachhilfe in regulären Ausdrück und hoffe, jemand kann mir das mal schnell sagen.
Ich möchte, dass eine Zeichenkette für späteren Gebrauch gemerkt wird.

Konkret:
suche alles bis zum {name}log und benenne um in {name}{date}.log

Also es gibt Dateien, die heißen alle unterschiedlich, haben alle aber hinten 'log' im Namen. Nun soll der String bis 'log' gemerkt werden, und das aktuelle Datum eingefügt werden.
mv {name}log {name}`date +%Y-%m-%d`.log

Ciao, micbur

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#2 Post by Lateralus »

Das hier sollte funktionieren:

Code: Select all

date = $(date +%Y-%m-%d)

for file in $(find . -type f -iname *.log); do
  name = $( echo $file | awk ' { sub(".log", "") } ' )
  mv $file "$name""$date".log
done
Problem dabei ist, das bei awk sub() nur die das erste gefundene .log ersetzt. gsub() würde alle ersetzen, aber nichtsdestotrotz würden dadurch ".log"s ersetzt, die mitten im Dateinamen vorkommen. Des weiteren bin ich mir nicht sicher, wie dieses Skript auf Dateien mit Leerzeichen reagieren würde.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#3 Post by jochen »

@lateralus: Da ist schon von der Syntax her eine kleine Verbesserung notwendig. Wenn um das "=" beim Setzen einer Variablen Blanks stehen, erkennt die Shell hier nicht mehr das Setzen einer Variablen, sondern den Aufruf eines Programms mit Namen der Variablen und "=" ale erstem Argument...

Code: Select all

date=$(date +%Y-%m-%d)

for file in $(find . -type f -iname *.log); do
  name=$( echo $file | awk ' { sub(".log", "") } ' )
  mv $file "$name""$date".log
done 
Außerdem kann man dafür auch mit shelleigenen Mitteln auskommen (bis auf das mv):

Code: Select all

#!/bin/bash

date=$(date +%Y-%m-%d)

for file in $(find . -type f -name *.log); do
  newname="${file%.log}${date}.log"
  mv "$file" "$newname"
done 
${file%.log} entspricht dem Inhalt der Variablen file weniger dem Part, der am Ende des Inhalts auf das Muster nach dem % passt, trennt also effektiv das .log ab. Damit bleibt der reine Name übrig, an den dann Datum und ".log" angehängt werden. So spart man sich pro Datei einen awk-Prozess.

Näheres zu ${%}, ${%%}, ${#} und ${##} findet man in der bash-Manualpage unter "Parameter Expansion".

Jochen
Die grösste Lüge der EDV? "Mal eben..."

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#4 Post by Lateralus »

@Jochen
Vielen Dank. Ich dachte mir schon, dass das einfacher geht, es fehlte nur das wie...

Post Reply