我想删除整个存档日志,除了保留最后生成的存档日志

我想删除整个存档日志,除了保留最后生成的存档日志

我想删除所有的归档日志,但只保留最后生成的归档日志。

目前我正在使用以下命令,它将删除整个/所有存档日志并清除目录本身。

find . -name "dbf*" -mtime +0 -exec rm -rf {} \;

但我想保留最后生成的归档日志。怎么做?我需要使用什么命令来实现相同的目的?

答案1

如果您无法知道每天只生成一个文件(在这种情况下,您的失败命令将起作用),则必须将find文件的日期时间戳和文件名组合的输出通过管道传输到sort然后sed在分割日期时间戳(再次使用sed)并将结果名称输入到 之前排除最后一行xargs -0 rm

find . -type f -name "dbf*" -printf "%T@:%p\0" | sort -z | sed -z '$d' | \
       sed -z 's/[0-9\.]*://' | xargs -0 rm

由于文件名将以./第二个开头sed,因此仅匹配第一个“:”,即使匹配是贪婪的(-printf "%T@:%p"给你类似的东西 1424765805.0206990940:./dbf_xyz

这也适用于带有空格和换行符的文件名,因为整个链都使用 NUL 终止的“行”

答案2

如果您不介意将最新文件复制到另一个目录,同时删除其余文件,则此方法有效。假设您当前的工作目录是包含日志的目录:

cp $(ls -Art | tail -n 1) /tmp \
&& rm -ri /path/to/logs \
&& cp /tmp/$(ls -Art /tmp | tail -n 1) ./ \
&& rm -i /tmp/$(ls -Art /tmp | tail -n 1)

细分:

  • cp $(ls -Art | tail -n 1) /tmp将其输出ls -Art | tail -n 1应该是最近修改的文件复制到/tmp目录中。您可能应该为此创建一个新目录,而不是/tmp,或者使用您知道不会有任何其他修改文件的目录。

  • rm -ri /path/to/logs应删除该目录中的所有文件描述符。

  • cp /tmp/$(ls -Art /tmp | tail -n 1) ./将会把最近修改的文件复制/tmp回你的工作目录。

  • rm -i /tmp/$(ls -Art /tmp | tail -n 1)删除复制到的文件/tmp

相关内容