如何在 Linux 中删除除最新 10 个文件之外的所有文件?

如何在 Linux 中删除除最新 10 个文件之外的所有文件?

我正在尝试让一个装满日志文件的目录易于管理。每晚,我想删除除最近的 10 个之外的所有文件。我如何用一个命令完成此操作?

答案1

要获得便携且可靠的解决方案,请尝试以下操作:

ls -1tr | head -n -10 | xargs -d '\n' rm -f --

tail -n -10其他答案中的语法似乎并不在任何地方都适用(即,在我的 RHEL5 系统上不起作用)。

在命令行上使用$()或存在以下风险``rm

  1. 用空格分割文件名,以及
  2. 超出最大命令行字符限制。

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

答案4

我修改了艾萨克的方法一点点。

它现在可以使用所需的路径:

ls -d -1tr /path/to/folder/* | head -n -10 | xargs -d '\n' rm -f

相关内容