我需要将旧的 binlog 移动到一个目录,然后在将其移动到新文件夹之前对其进行压缩。
由于空间紧张,我们面临着一些问题。
下面的命令不起作用。
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/
上面假设 GNU coreutils,它接受-z
( sort
、cut
和tail
) 或-0
( xargs
) 使用 NUL 分隔行,这意味着即使文件名中包含换行符,代码也能正常工作。
如果您可以确定文件名中没有换行符,则事实证明您不需要使用 null ( \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/