我正在尝试让一个装满日志文件的目录易于管理。每晚,我想删除除最近的 10 个之外的所有文件。我如何用一个命令完成此操作?
答案1
要获得便携且可靠的解决方案,请尝试以下操作:
ls -1tr | head -n -10 | xargs -d '\n' rm -f --
tail -n -10
其他答案中的语法似乎并不在任何地方都适用(即,在我的 RHEL5 系统上不起作用)。
在命令行上使用$()
或存在以下风险``
rm
- 用空格分割文件名,以及
- 超出最大命令行字符限制。
xargs
解决了这两个问题,因为它会自动计算出在字符限制内可以传递多少个参数,并且它-d '\n'
只会在输入的行边界处进行拆分。从技术上讲,这仍然会给包含换行符的文件名带来问题,但这种情况比包含空格的文件名少见得多,而且绕过换行符的唯一方法会复杂得多,可能至少需要 awk,如果不是 perl 的话。
如果您没有 xargs(也许是旧的 AIX 系统?),您可以将其设为循环:
ls -1tr | head -n -10 | while IFS= read -r f; do
rm -f "$f"
done
这会稍微慢一点,因为它会rm
为每个文件生成一个单独的文件,但仍然可以避免上面的警告 1 和 2(但仍然会受到文件名中换行符的影响)。
答案2
您想要在脚本中包含的代码是
rm -f $(ls -1t /path/to/your/logs/ | tail -n +11)
为了安全起见, (numeric one)选项-1
将每个文件打印在一行上。-f
选项告诉它在不返回任何内容rm
时忽略不存在的文件。ls
答案3
显然解析ls
是邪恶的。
如果每个文件都是每天创建的,并且您想要保留过去 10 天内创建的文件,您可以执行以下操作:
find /path/to/files -mtime 10 -delete
或者如果每个文件都是任意创建的:
find /path/to/files -maxdepth 1 -type f -printf '%Ts\t%P\n' | sort -n | head -n -10 | cut -f 2- | xargs rm -rf