![Как переместить старые журналы - журналы mysql](https://rvso.com/image/192244/%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D1%82%D0%B0%D1%80%D1%8B%D0%B5%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D1%8B%20-%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D1%8B%20mysql%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
not для анализа вывода 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/
Вышеприведенное предполагает использование GNU coreutils, которые допускают -z
( sort
, cut
и tail
) или -0
( xargs
) для использования строк, разделенных NUL, что означает, что код работает правильно даже при наличии новых строк в именах файлов.
Если вы уверены, что в именах файлов нет новых строк, то оказывается, что вам не нужно завершать каждый найденный файл нулем ( \0
), поскольку вы сортируете построчно по первому полю (время последнего изменения файлов), которое никогда не содержит проблемных символов. Вы можете упростить вышесказанное до:
$ 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/