So verschieben Sie alte Protokolle - MySQL-Protokolle

So verschieben Sie alte Protokolle - MySQL-Protokolle

Ich muss alte Binärprotokolle in ein Verzeichnis verschieben und sie außerdem komprimieren, bevor ich sie in einen neuen Ordner verschiebe.

Ich habe Platzmangel, der uns vor Problemen steht.

Der folgende Befehl funktioniert nicht.

ls -t binlog* | tail -n +4 | xargs mv /path-to-directory
ls -t binlog* | tail -n +4 | xargs echo mv /path-to-directory

Antwort1

Wenn Sie WIRKLICH nicht auf logrotate zurückgreifen möchten, verwenden Sie findnicht, um die Ausgabe von zu analysieren ls, und geben Sie gleichzeitig den Änderungszeitpunkt der zuletzt gefundenen Datei in Sekunden seit dem 01.01.1970 aus.

$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\0" \
 | sort -z -k 1 -r \
 | cut -z -d " " -f2- \
 | tail -z -n +4 \
 | xargs -0 -I {} mv -f "{}" /path/to/directory/

Das Obige setzt GNU-Coreutils voraus, die -z( sort, cutund tail) oder -0( xargs) akzeptieren, um NUL-getrennte Zeilen zu verwenden, was bedeutet, dass der Code auch mit Zeilenumbrüchen in den Dateinamen korrekt funktioniert.

Wenn Sie sicher sind, dass die Dateinamen keine Zeilenumbrüche enthalten, müssen Sie nicht jede gefundene Datei mit einem Nullzeichen ( \0) beenden, da Sie zeilenweise nach dem ersten Feld (letzte Änderungszeit der Dateien) sortieren, das niemals problematische Zeichen enthält. Sie können das Obige folgendermaßen vereinfachen:

$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\n" \
 | sort -k 1 -r \
 | cut -d " " -f2- \
 | tail -n +4 \
 | xargs -I {} mv -f "{}" /path/to/directory/

verwandte Informationen