mymeyer
Goto Top

cp-Befehl mehrere Dateien kopieren

Hallo,

folgendes Problem habe ich wo ich keine Lösung so richtig finde. Ich möchte einen Script über Cron starten.Kurze Vorgeschichte: Bei uns auf dem System werden täglich mehrer Log-Files geschrieben die automatisch nach nach ca. 2,5 Tagen immer wir bei Log-File 01 beginnen. Ich möchte jetzt immer nur die aktuellenTages Log in ein anderes Verzeichnis kopieren inkl Datums Erweiterung am Log-File Name.

Ich habe mir jetzt mit "find" eine Zeile geschrieben wo er nur die Log-Files vom aktuellen Tag kopieren soll. Der Job startet um 23:59h. Das Problem was ich habe ist das es das an zwei verschiedenen Tagen gleiche Log-Files Namen gibt und der Job die alten Files überschreiben.

Hier mal ein Auflistung wie ich mir das vorstelle:

Log.01
Log.02
Log.03
Log.04
..
.. (So schreibt das System die Logfiles täglich max 100 in Summe).

ich möchte jetzt folgendes erreichen mit dem CP-Befehl.

Beispiel:

Heuet ist der 15.04.2009

cp Log.01 /tmp/2009-04-15.log.01
cp Log.02 /tmp/2009-04-15.log.02
cp Log.03 /tmp/2009-04-15.log.03
cp Log.04 /tmp/2009-04-15.log.04

Nächte Tage: 16.04.2009

cp Log.01 /tmp/2009-04-16.log.01
cp Log.02 /tmp/2009-04-16.log.02
cp Log.03 /tmp/2009-04-16.log.03
cp Log.04 /tmp/2009-04-19.log.04


Ich kann die Files auch nicht verschieben mit mv da das System die Anzahl 100 Log-Files benötigt. Warum ich das machen will. Ich möchte die Logfiles über einen bestimmten Zeitraum sammeln für Analysen z.B. und später dann wieder über eine Cron-Job löschen. Aber mit dem cp-Befehl bekomme ich das nicht hin.


Aufruf ist:

datum=`/bin/date +%Y-%m-%d`
find /log/ -mtime 0 -type f -name "\Log.*" -exec cp -p {} /tmp/"$datum".log.01 \;

Gruß
MyMeyer

Content-ID: 113877

Url: https://administrator.de/forum/cp-befehl-mehrere-dateien-kopieren-113877.html

Ausgedruckt am: 22.12.2024 um 12:12 Uhr

godlie
godlie 15.04.2009 um 12:38:52 Uhr
Goto Top
Wie wärs mit sowas:

#!/bin/sh
dt=`date +%Y-%m-%d`
for i in $( ls Log.* ); do
rn=`echo $i | cut -d "." -f 2`;  
echo $dt.log.$rn;
cp $i /tmp/$dt.log.$rn
done
75823
75823 16.04.2009 um 11:19:11 Uhr
Goto Top
Ich hab noch nicht ganz die Logik verstanden wie die Logst entstehen. Kannst du bitte die Ergebnis von "ls -lct /deinlog/" posten?
mymeyer
mymeyer 16.04.2009 um 14:01:33 Uhr
Goto Top
Zitat von @75823:
Ich hab noch nicht ganz die Logik verstanden wie die Logst entstehen.
Kannst du bitte die Ergebnis von "ls -lct /deinlog/" posten?

Hi,

ich verstehe nicht was du jetzt meinst. Die Log-Files werden von einer Application erzeugt und liegen im LOG Verzeichnis.
Da wir aber so viel LOG schreiben (wird auch benötigt) möchte ich die Dateien tagesbezogen kopieren. Die Anzahl erhöhen oder die Files vergrössern geht auch nicht weil auf dem Filesystem nicht genug Platz vorhanden ist. Deswegen auf ein anderes Filesystem kopieren. Dort werde ich sie dann wieder nach ein paar Tagen löschen.

Gruß
MyMeyer
75823
75823 16.04.2009 um 16:17:48 Uhr
Goto Top
Lesen kann ich, das selbe hasst du erstes mal auch geschrieben.
Ich will wissen welche Kriterien hat das Programm für die Logs, ob die sie nach Größe oder nach Zeit trennt. Dann kann man ein vernünftigen Skript machen der die Logs ohne Wiederholung speichert.
mymeyer
mymeyer 16.04.2009 um 21:27:55 Uhr
Goto Top
Hi,

Upps face-smile Jetzt habe ich es auch verstanden. Na ja die Log Files sind immer 10 MB groß und es werden max 101 Stück geschrieben.
Und schreibt es erst ins Haupt Log und wenn das 10 MB erreicht hat wird es weg geschrieben. Die aktuellen Info kommen immer ins Haupt Log.

1. Haupt Log = logging.log
2. Folge Log = logging.old.01
usw.
3.End Log = Logging.old.99

Gruß
MyMeyer
75823
75823 16.04.2009 um 21:53:09 Uhr
Goto Top
haben die Logst unterschiedliche Changetime? Wie ich schon früher sagte : Die Ergebnis von "ls -lct log/" wurde hilfreich.

Hier ist ein Skript auf schnelle Hand. Hoffe ich wird dir helfen

#!/bin/bash
log_dir="dein_log_ordner"  
dist_dir="tmp_ordenr"  

for i in $( ls $log_dir/ | grep old); do
   file_date=$( stat --printf=%y $log_dir/$i | cut -d'.' -f1 | tr " " "_" | tr ":" "-" );  
   cp $log_dir/$i $dist_dir/$file_date.log
done;
mymeyer
mymeyer 17.04.2009 um 08:59:09 Uhr
Goto Top
Hi,
hier die Ausgabe wie gewünscht mit "ls -lct log*". Aber die Uhrzeit verwundert mich jetzt. Warum ist die denn immer gleich bei .old Dateien ?


6459365 Apr 17 08:54 logging
10485700 Apr 17 08:33 logging.old.00
10485707 Apr 17 08:33 logging.old.01
10485698 Apr 17 08:33 logging.old.02
10485711 Apr 17 08:33 logging.old.34
10485750 Apr 17 08:33 logging.old.33
10485691 Apr 17 08:33 logging.old.29
10485187 Apr 17 08:33 logging.old.31

usw für restlichen Files.


Gruß
MyMeyer
75823
Lösung 75823 17.04.2009, aktualisiert am 25.02.2015 um 09:18:38 Uhr
Goto Top
Oh man! wie blöd muss man sein um so ein Programm zu schreiben.
Dann den Skript von godlie passt hier am besten. Vielleicht mit kleinen Änderungen.

#!/bin/sh 
dt=`date +%Y-%m-%d`
tar cvfj /zielordenr/$dt.log.tar.bz2 /log/logging.old*