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
Nachhilfe in regex
Das hier sollte funktionieren:
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.
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
@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...Außerdem kann man dafür auch mit shelleigenen Mitteln auskommen (bis auf das mv):${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
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
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
Näheres zu ${%}, ${%%}, ${#} und ${##} findet man in der bash-Manualpage unter "Parameter Expansion".
Jochen
Die grösste Lüge der EDV? "Mal eben..."