![古いログを移動する方法 - mysql ログ](https://rvso.com/image/192244/%E5%8F%A4%E3%81%84%E3%83%AD%E3%82%B0%E3%82%92%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%20-%20mysql%20%E3%83%AD%E3%82%B0%20.png)
古いバイナリログをディレクトリに移動し、新しいフォルダーに移動する前に圧縮する必要があります。
スペースが不足しているため、問題が発生しています。
以下のコマンドは機能しません。
ls -t binlog* | tail -n +4 | xargs mv /path-to-directory
ls -t binlog* | tail -n +4 | xargs echo mv /path-to-directory
答え1
本当に logrotate に頼りたくない場合は、find
の出力を解析せずls
に、最後に見つかったファイルの変更時刻を 1970.01.01 からの秒数で出力します。
$ 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/
上記は、 NUL 区切りの行を使用するために-z
( sort
、cut
およびtail
) または-0
( xargs
) を受け入れる GNU coreutils を想定しています。つまり、ファイル名に改行があってもコードは正しく動作します。
ファイル名に改行文字が含まれていないことが確実な場合は、問題となる\0
文字が含まれない最初のフィールド (ファイルの最終変更時刻) に基づいて行ごとに並べ替えているため、見つかった各ファイルを null ( ) で終了する必要がないことがわかります。上記を次のように簡略化できます。
$ 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/