
Мне нужно переместить старые бинарные журналы в каталог и сжать их перед перемещением в новую папку.
У меня нехватка места, из-за чего у нас возникают проблемы.
команда ниже не работает.
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/