Bash 脚本删除最旧的文件但保留最新的文件(包括子目录)

Bash 脚本删除最旧的文件但保留最新的文件(包括子目录)

我正在尝试删除旧文件,但应该保留最近 3 天的日志文件。我尝试了以下命令,

ls -tr /home/httpd/htdocs/路径名/路径名/config//构建/日志/应用程序/.log | tail -n +4 | xargs rm --

但是所有文件都被删除了,只保留一个文件夹中的 3 个文件。但我想分别保留每个文件夹中的 3 个文件。

谁能帮我解决这个问题。

答案1

你可以尝试一下,将下面的内容放入一个shell脚本文件中并执行它。

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

替换/tmp/test为您的目录名称。

答案2

你可以使用这个命令:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

或者循环:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

在哪里:

  • ls -t:按修改时间的降序列出文件,每行一个文件名。
  • sed -e '1,3d':删除前 3 行
  • xargs -d '\n' rm:对于每个输入行(不包含终止换行符),将其作为参数传递给rm
  • -d '\n':这是出于效率的考虑,使得 xargs 将每一行输入视为一个单独的参数,但同时传递命令行上尽可能多的参数,因此 rm 不会为每个参数重新调用。

更多可能性,请参阅文章 删除 bash 中除最近的 X 文件之外的所有文件

相关内容