我想删除所有的归档日志,但只保留最后生成的归档日志。
目前我正在使用以下命令,它将删除整个/所有存档日志并清除目录本身。
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
。