![So verschieben Sie alte Protokolle - MySQL-Protokolle](https://rvso.com/image/192244/So%20verschieben%20Sie%20alte%20Protokolle%20-%20MySQL-Protokolle%20.png)
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 find
nicht, 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
, cut
und 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/